PHP 卷曲,POST JSON

Posted

技术标签:

【中文标题】PHP 卷曲,POST JSON【英文标题】:PHP cURL, POST JSON 【发布时间】:2011-05-15 08:54:35 【问题描述】:

我需要发布以下 JSON 代码,但由于某种原因它无法正常工作。下面是我的代码。

$fieldString = "395609399";
//the curl request processor
function processCurlJsonrequest($URL, $fieldString)  //Initiate cURL request and send back the result
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HTTPHEADERS, array('Content-Type: application/json'));
    curl_setopt($ch, CURLOPT_URL, $URL);
    curl_setopt($ch, CURLOPT_USERAGENT, $this->_agent);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $this->_cookie_file_path);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $this->_cookie_file_path);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
    if ($fieldCount)  // in case of post fields present then pass it on
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode("categoryId: $fieldString"));
        curl_setopt($ch, CURLOPT_POST, 1);
    
    $resulta = curl_exec($ch);
    if (curl_errno($ch)) 
        print curl_error($ch);
     else 
        curl_close($ch);
    
    return $resulta;

这是调用 cURL 请求的函数:

function get_cat($categoryId, $URL) 
    $fields = array(
        "categoryId" => $categoryId
    );
    $fields_string = $fields;
    return $this->processCurlJsonrequest($URL, $fields_string);

【问题讨论】:

给json_encode一个php数组,而不是一个已经是JS对象形式的字符串。 我试过 curl_setopt($ch, CURLOPT_POSTFIELDS, array(json_encode(array( "categoryId"=>"5016"))));和 json_encode(array("categoryId"=>"5016")));并且也不工作 您显然解决了问题(如您的评论所示)但没有更新帖子以说明解决方案是什么,这真是太烦人了。 【参考方案1】:

问题在于:

curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode("categoryId: $fieldString"));

CURLOPT_POSTFIELDS 将接受参数数组或 URL 编码的参数字符串:

curl_setopt($ch, CURLOPT_POSTFIELDS, array('json'=>json_encode($stuff)));
curl_setopt($ch, CURLOPT_POSTFIELDS, 'json='.urlencode(json_encode($stuff)));

json 将是 POST 字段的名称(即:将导致 $_POST['json'] 可访问)。

【讨论】:

由于某些原因无法正常工作。我收到 "Message":"There was an error processing the request.","StackTrace":"","ExceptionType":""Array ( [Message] => There was an error processing the request. [ StackTrace] => [ExceptionType] => ) 。我认为是因为帖子没有正确发布。 我已经在这个链接上上传了一张图片,这样你就可以看到我试图用 php curl 复制的来自 http 分析器的确切发布请求。 img502.imageshack.us/img502/1346/analyzer.jpg 正如您在 http 分析器中看到的,没有出现任何帖子字段(例如“json”) @Michael 您发布的服务器设置了不接受 POSTFIELDS 生成的普通 PHP 发布请求的安全功能。您需要将正文代码放在一个文件中并通过 php.ini 上传该文件。我遇到了类似的问题。【参考方案2】:

发送不带 JSON 编码的文本,并添加此标头代码:

curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json; charset=utf-8","Accept:application/json, text/javascript, */*; q=0.01")); 

【讨论】:

【参考方案3】:

对于最初的例子,工作代码应该是这样的:

//the curl request processor
function processCurlJsonrequest($URL, $fieldString)  //Initiate cURL request and send back the result
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
    curl_setopt($ch, CURLOPT_URL, $URL);
    curl_setopt($ch, CURLOPT_USERAGENT, $this->_agent);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $this->_cookie_file_path);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $this->_cookie_file_path);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(array("myJsonData" => "test")));
    curl_setopt($ch, CURLOPT_POST, 1); 
    $resulta = curl_exec($ch);
    if (curl_errno($ch)) 
        print curl_error($ch);
     else 
        curl_close($ch);
    
    return $resulta;

【讨论】:

【参考方案4】:

我在通过 cURL 发送 JSON 时遇到问题,问题是我没有在标头中明确设置内容长度。

所以标题应该是:

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: ' . strlen($json)));

【讨论】:

【参考方案5】:

真的很简单,确保你已经为 json 设置了额外的 Content-Type 标头,然后 CURLOPT_POSTFIELDS 可以将 json 作为字符串。无需编码。

【讨论】:

以上是关于PHP 卷曲,POST JSON的主要内容,如果未能解决你的问题,请参考以下文章

php 卷曲请求类(GET,POST)

处理大卷曲响应 - PHP

将 POST 卷曲到 C#

sh 卷曲POST

javascript WP - 使用Ajax进行卷曲POST

使用postFrom或POST将代码卷曲到R.