php
  • json
  • curl
  • 2012-01-30 84 views 4 likes 
    4

    我想通过一个json数据作为参数cURL POST。但是,我坚持抓住它并将其保存在数据库中。通过CURL POST JSON数据并抓取它

    卷曲文件:

    $data = array("name" => "Hagrid", "age" => "36");                  
    $data_string = json_encode($data);                     
    
    $url = 'http://localhost/project/test_curl'; 
    
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(                   
                'Content-Type: application/json')                       
                );      
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                          
    
    $result = curl_exec($ch); 
    
    //based on http://www.lornajane.net/posts/2011/posting-json-data-with-php-curl 
    

    test_curl文件:

    $order_info = $_POST; // this seems to not returning anything 
    
        //SAVE TO DB... saving empty... 
    

    我错过了什么? Weew ....

    +0

    作为您的教程链接提到你有内容长度参数添加为一个额外的头。我可以确保这个教程完全起作用(我在2天前使用了它)。如果这不起作用,那么curl请求的设计目标可能没有预期的行为。 – TRD 2012-01-30 10:03:13

    +0

    顺便说一句,CURLOPT_POSTFIELDS需要一个关联数组来发布,像数组('data'=> $ data_string),否则它不会发布任何信息 – dievardump 2012-01-30 10:06:42

    +0

    @DieVarDump这是不正确的。它接受一个字符串或一个关联数组。如果你想使用'Content-Type:application/json',它*必须*是一个字符串。最好自己创建一个字符串并传递它,因为如果传递一个数组,Content-Type将成为'multipart/form-data',并且请求体可能会比使用'应用程序/ x-WWW的形式urlencoded'。 – DaveRandom 2012-01-30 10:08:09

    回答

    20

    您正在将数据作为原始JSON发送到正文中,因此它不会填充$_POST变量。

    你需要做两件事情之一:

    1. 您可以更改内容类型以一个将填充$_POST阵列
    2. 您可以读取原始正文数据。

    如果您对通信的两端都有控制权,那么我会推荐选项二,因为它会将请求主体大小保持在最小值并随着时间的推移节省带宽。 (编辑:我在这里没有真正强调它将节省的带宽量可以忽略不计,每个请求只有几个字节,这只会是一个有效的担心是非常高的流量环境。但我仍然建议选项二,因为它是最干净的方式

    在你test_curl文件,这样做:

    $fp = fopen('php://input', 'r'); 
    $rawData = stream_get_contents($fp); 
    
    $postedJson = json_decode($rawData); 
    
    var_dump($postedJson); 
    

    如果你想填充$_POST变量,则需要改变你的数据发送到服务器的方式:

    $data = array (
        'name' => 'Hagrid', 
        'age' => '36' 
    ); 
    
    $bodyData = array (
        'json' => json_encode($data) 
    ); 
    $bodyStr = http_build_query($bodyData); 
    
    $url = 'http://localhost/project/test_curl'; 
    
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/x-www-form-urlencoded', 
        'Content-Length: '.strlen($bodyStr) 
    )); 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $bodyStr); 
    
    $result = curl_exec($ch); 
    

    原始未解码的JSON现在将在$_POST['json']中提供。

    +1

    我做了选项二。非常感谢你!它的工作,你解释得很好......哇,我错过了很多。再次,谢谢! – Woppi 2012-01-30 10:18:35

    +0

    thx了解详细信息,GET与这两种内容类型的工作方式相同吗? – 2012-06-30 19:53:40

    +0

    @ciril GET请求没有内容,因此没有'content-type'。如果你不想通过GET传递JSON(顺便说一句,我不推荐),你需要将它附加到URL中。例如'$ url ='http://example.com/script.php?json='.urlencode(json_encode($ data));' - 数据将在$ _GET ['json']中提供'在另一端。 – DaveRandom 2012-06-30 19:56:42

    0

    使用以下php函数以x-www-form-urlencoded格式使用php curl函数发布数据。

    <?php 
        $bodyData = http_build_query($data); //for x-www-form-urlencoded 
    ?> 
    
    +0

    请注意在不同网站上链接到您自己的内容,您不希望成为[垃圾邮件发送者](// $ SITEURL $/help/promotion)。您应该在这里包含大部分内容,并仅将该链接用作参考。 – JAL 2016-04-26 01:39:57

    相关问题