使用 PHP cURL 发布 JSON

问题描述 投票:0回答:10

我有以下 PHP 代码:

curl_setopt($ch, CURLOPT_URL, $URL);
curl_setopt($ch, CURLOPT_USERAGENT, $this->_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $this->_headers);
curl_setopt($ch, CURLOPT_ENCODING , "gzip");
curl_setopt($ch, CURLOPT_VERBOSE, false); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_TIMEOUT,  120);
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_POSTFIELDS, '{"folderId":"1","parameters":{"amount":3,"ascending":false,"offset":0,"sort":"date"}}');
curl_setopt($ch, CURLOPT_POST, 1); 

但我不明白为什么不起作用。 我发布 JSON 的 API 表示未收到参数。 我的代码有什么问题吗?我认为整个技巧在于 JSON 参数。 我不知道如何发送它们,因为我在 HTTP 分析器中看不到任何“nave->value”对,因为它通常以简单的形式出现......只是没有任何“名称”的 JSON 代码。

php curl
10个回答
5
投票

您可以尝试如下。 基本上,如果我们有一个数据数组,那么它应该是使用 php

json encoded
json_encode
。你还应该在
content-type
中添加
header
,它可以在curl中定义为
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));

$data = array("country"=>"US","states"=>array("MHASASAS"=>"MH","XYZABABA"=>"XYZ"));
$postdata = json_encode($data);

$ch = curl_init($URL);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
$result = curl_exec($ch);
curl_close($ch);

3
投票

您可以使用它并替换为

curl_setopt($ch, CURLOPT_POSTFIELDS, '{"folderId":"1","parameters":{"amount":3,"ascending":false,"offset":0,"sort":"date"}}');

用这个

$Parameters = array(
    'MerchantCode'        => $MerchantCode,
    'PriceValue'          => $amount,
    'ReturnUrl'           => $callback,
    'InvoiceNumber'       => $resnum,
);

    curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($Parameters));

2
投票

如果:你使用post方法,你应该知道:

CURLOPT_POST TRUE 执行常规 HTTP POST。此 POST 是普通的 application/x-www-form-urlencoded 类型,最常用于 HTML 表单。

@参见http://php.net/manual/en/function.curl-setopt.php

所以:你可以这样做:

$ar_form = array('name'=>'PHPJungle','age'=>66,'gender'=>'male');
$poststr = http_build_query($ar_form ); # important

$options[CURLOPT_HTTPGET] = false;
$options[CURLOPT_POST] = true;
$options[CURLOPT_POSTFIELDS] = $poststr ; //default type:application/x-www-from-urlencoded

curl_setopt_array ( $ch, $options );
# @todo your other codes

这是我使用了很长时间的类。该类基于 PHP cURL。 支持GET/POST,HTTP/HTTPS。

@参见https://github.com/phpjungle/iHttp/


2
投票

您可以像这样使用curl发布json数据:

使用命令提示符:

    curl -X POST -H "Content-Type: application/json" -d '{"folderId":"1","parameters":{"amount":3,"ascending":false,"offset":0,"sort":"date"}}' $url

使用 PHP:

    $data = array("folderId"=>"1","parameters"=>array("amount"=>3,"ascending"=>false,"offset"=>0,"sort"=>"date"));
    $postdata = json_encode($data);
    OR
    $postdata = '{"folderId":"1","parameters":{"amount":3,"ascending":false,"offset":0,"sort":"date"}}';
    
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
    $result = curl_exec($ch);
    curl_close($ch);

    print_r($result);

1
投票

您尚未设置内容类型,因此帖子数据将作为表单数据发送。尝试将内容类型设置为 application/json。

如果这不起作用,请尝试用数组包装 json 字符串。


1
投票
$link = "http://test.domain/myquery";
   $json = '{"folderId":"1","parameters":{"amount":3,"ascending":false,"offset":0,"sort":"date"}}';
   $postdata = json_decode($json);
 echo openurl($link, $postdata);

这就像 json 解码将 json 字符串转换为数组一样。

function openurl($url, $postvars = "") {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postvars);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, '3');
        $content = trim(curl_exec($ch));
        curl_close($ch);
        return $content;
    }

1
投票

如果您的 API 端点使用正文使用 json 数据发送请求,您可以使用 Guzzle,文档在这里 doc

use GuzzleHttp\Client;
$client = new Client();
$request = $this->client->post($url,array(
            'content-type' => 'application/json'
    ),array());
$request->setBody($json_data);
$response = $request->send();
return $response;

希望这能成功。


1
投票

您可以按照步骤进行制作:

$data = array(
    'folderId'=>"1","parameters"=>array(
        "amount"=>"3","ascending"=>false,"offset"=>0,"sort"=>"date"
    )
);

$data_string = http_build_query($data);

$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_POST, count($data));
curl_setopt($ch,CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);

$result = json_decode($result,true);

我不知道你是否需要标题。我认为默认情况下它已经是

application/x-www-form-urlencode

如果不起作用,请尝试更改数组中的

$data
值。认为这有帮助。 :)


0
投票

我不确定,这就是解决方案,但这对我发布 json 时有效,将 json 更改为

'{"folderId":"1","parameters":{"amount":3,"ascending":false,"offset":0,"sort":"date"}}'

"{'folderId':'1','parameters':{'amount':3,'ascending':false,'offset':0,'sort':'date'}}"

我所做的唯一更改是双引号现在在外面,这对我有用,但我显然要发布到不同的服务器

我能提供的唯一帮助是下载网络调试工具,例如

Fiddler
Charles
代理并监视发送/接收的请求,这可能是代码中出现其他问题的情况。

希望我有帮助:)


0
投票

首先 请检查curl http状态码

$http_code= curl_get_info($exec_res,CURL_HTTP_CODE);

然后使用 post header API 服务器修改此请求标头集,添加一个记录器来记录这些请求信息。

© www.soinside.com 2019 - 2024. All rights reserved.