【问题标题】:POST JSON data via CURL and grabbing it通过 CURL POST JSON 数据并抓取它
【发布时间】:2012-02-22 03:21:54
【问题描述】:

我正在尝试将 json 数据作为 cURL POST 的参数传递。但是,我坚持抓住它并将其保存在数据库中。

cURL 文件:

$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...

我错过了什么?呜呜……

【问题讨论】:

  • 如教程链接中所述,您必须将内容长度参数添加为附加标头。我可以确保本教程完全有效(我在 2 天前为自己使用过)。如果这不起作用,则 curl 请求的设计目标可能没有预期的行为。
  • 顺便说一下,CURLOPT_POSTFIELDS 需要一个关联数组来发布,比如 array('data' => $data_string) 否则它不会发布任何东西
  • @DieVarDump 这不是真的。它接受字符串或关联数组。如果你想使用Content-Type: application/json必须是一个字符串。最好自己创建字符串并传递它,因为如果传递数组,Content-Type 将是 multipart/form-data,请求正文可能比使用 application/x-www-form-urlencoded 时大得多。
  • @DaveRandom 是的,我的错误,我没有看到 HTTPHEADER...忘记我之前的评论。
  • @TRD 是的...我只是对处理 JSON 帖子感到困惑,只是在我的问题中提到了我的例子。只是说教程没有问题......我在掌握它时遇到了问题。 :) 谢谢老兄!

标签: php json curl


【解决方案1】:

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

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

【讨论】:

  • 请谨慎链接到您自己在不同网站上的内容,您不想成为spammer。您应该在此处包含大部分内容,并且仅将链接用作参考。
【解决方案2】:

您将数据作为正文中的原始 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'] 中提供。

【讨论】:

  • 我做了选项二。非常感谢!它起作用了,你确实解释得很好......哇,我确实错过了很多。再次感谢!
  • 感谢此详细信息,GET 与这两种内容类型的工作方式相同吗?
  • @ciril GET 请求没有内容,因此没有content-type。如果您不想通过 GET 传递 JSON(顺便说一句,我不推荐),您需要将其附加到 URL。例如$url = 'http://example.com/script.php?json='.urlencode(json_encode($data)); - 然后数据将在另一端的$_GET['json'] 中可用。
  • 对,所以我也可以在我的代码中删除 curl_setopt($curl, CURLOPT_HTTPHEADER, $httpHeader);可能在执行获取时,thx
  • 如果所有标题都与内容相关,可能是的。虽然老实说,我认为 cURL 在使用前检查标头时非常聪明——我怀疑如果你把它们留在里面,它会坏掉。
猜你喜欢
  • 2015-04-02
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
相关资源
最近更新 更多