在命令窗口中为Aria项目使用curl我得到了我想要的,但是在PHP文件中它返回了空字符串

时间:2018-11-22 10:14:45

标签: php curl libcurl

当我在git bash中键入此命令时:

curl -i -X POST --header "content-type: application/json;charset=UTF-8" --header "Authorization: Bearer X" -d @RequestBody.json https://app.studio.arria.com:443/alite_content_generation_webapp/text/X

我得到:

  

HTTP / 2 200日期:2018年11月22日星期四09:45:27 GMT内容类型:   application / json; charset = UTF-8服务器:nginx

     

[{“ errorType”:null,“ errorMessage”:null,“ warnings”:[],“ result”:“

维多利亚   占地面积227,416平方公里,2016年人口   为5,938,100,比2010年的5,547,500增加了7.04%。   首都墨尔本人口为4,353,514,   比2010年的3,953,939增长10.11%,占73.31%   

总理丹尼尔·安德鲁斯(ALP)是   在他的第一个   


“,” wordCount“:60},{” errorType“:null,” errorMessage“:null,”警告“:[],”结果“: “

  澳大利亚首都特区的土地面积为2,358平方   公里,2016年人口为390,800,比上一年增长8.89%   2010年为358,900人。首都堪培拉有一个   人口424,666,比2010年的398,430增长6.58%,   占该州人口的73.31%。

总理,   安德鲁·巴尔(ALP),是他的第一个   


“,” wordCount“:63},{” errorType“:null,” errorMessage“:null,”警告“:[],”结果“: “

  北领地的土地面积为1,349,129平方公里,   2016年的人口为244,600,比2010年的数字高出6.49%   229,700。首都达尔文市人口123,396,   较2010年的112,987上升了9.21%,占比为73.31%   州人口。

总理迈克尔·冈纳(Michael Gunner,简称ALP)在   他的第一个任期。


“,” wordCount“:62}]

但是当我使用PHP文件时,我粘贴了从Curl to PHP获得的命令

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "https://app.studio.arria.com:443/alite_content_generation_webapp/text/X");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$post = array(
    "file" => "@" .realpath("RequestBody.json")
);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_POST, 1);

$headers = array();
$headers[] = "Content-Type: application/x-www-form-urlencoded";
$headers[] = "Authorization: Bearer X";
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}else {
    var_dump($result);
    $json = json_decode($result,true);
    var_dump($json);
}
curl_close ($ch);

var_dump($result)返回

  

string(0)“”

var_dump($json)返回

  

NULL

在这篇文章中,我将URL中的项目的Authorization Bearer和ID更改为X,但是如果您认为问题出在这些方面,则可以发布原始命令。

RequestBody.json:

{
    "data": [
      {
        "id": "Primary",
        "type": "1d",
        "dataSet": [
          ["State", "Premier", "Party", "Terms", "StateLandArea", "StatePop2010", "StatePop2016", "Capital", "CapitalPop2010", "CapitalPop2016"],
          ["Victoria", "Daniel Andrews", "ALP", "1", "227,416", "5,547,500", "5,938,100", "Melbourne", "3,953,939", "4,353,514"],
          ["the Australian Capital Territory", "Andrew Barr", "ALP", "1", "2,358", "358,900", "390,800", "Canberra", "398,430", "424,666"],
          ["the Northern Territory", "Michael Gunner", "ALP", "1", "1,349,129", "229,700", "244,600", "Darwin", "112,987", "123,396"]
        ]
      }
    ],
    "options": {
      "nullValueBehaviour": "SHOW_IDENTIFIER",
      "contentOutputFormat": "HTML"
    }
  } 

1 个答案:

答案 0 :(得分:1)

不要在PHP的libcurl包装器中使用@方法,它在PHP 5.5中已弃用,在PHP 5.6中默认禁用,在PHP 7.0中已完全删除。如果您使用的是PHP 5.5或更高版本,请改用CURLFile,

$post = array(
    "file" => new CURLFile("RequestBody.json")
);

但这不是您的php代码无法正常工作的原因,当您为CURLOPT_POSTFIELDS提供php中的数组时,curl将以multipart/form-data格式创建您的发布请求,而您的curl cli调用将发送数据json-编码。让php-curl像cli调用一样在帖子正文中发送json,将原始json字符串直接提供给CURLOPT_POSTFIELDS,或者如果您已经在文件中包含响应,则使用CURLOPT_INFILE,

这应该是PHP中的等效请求:

$ch = curl_init ();
$fp = fopen ( "RequestBody.json", "rb" );
curl_setopt_array ( $ch, array (
        CURLOPT_POST => 1,
        CURLOPT_INFILE => $fp,
        CURLOPT_HTTPHEADER => array (
                "content-type: application/json;charset=UTF-8",
                "Authorization: Bearer X" 
        ),
        CURLOPT_URL => 'https://app.studio.arria.com:443/alite_content_generation_webapp/text/X' 
) );
curl_exec ( $ch );
curl_close ( $ch );
fclose ( $fp );

或者,如果您的请求正文是动态/可变的,则可以执行以下操作:

$post=array (
        'data' => array (

                array (
                        'id' => 'Primary',
                        'type' => '1d',
                        'dataSet' => array (

                                array (
                                        'State',
                                        'Premier',
                                        'Party',
                                        'Terms',
                                        'StateLandArea',
                                        'StatePop2010',
                                        'StatePop2016',
                                        'Capital',
                                        'CapitalPop2010',
                                        'CapitalPop2016' 
                                ),

                                array (
                                        'Victoria',
                                        'Daniel Andrews',
                                        'ALP',
                                        '1',
                                        '227,416',
                                        '5,547,500',
                                        '5,938,100',
                                        'Melbourne',
                                        '3,953,939',
                                        '4,353,514' 
                                ),

                                array (
                                        'the Australian Capital Territory',
                                        'Andrew Barr',
                                        'ALP',
                                        '1',
                                        '2,358',
                                        '358,900',
                                        '390,800',
                                        'Canberra',
                                        '398,430',
                                        '424,666' 
                                ),

                                array (
                                        'the Northern Territory',
                                        'Michael Gunner',
                                        'ALP',
                                        '1',
                                        '1,349,129',
                                        '229,700',
                                        '244,600',
                                        'Darwin',
                                        '112,987',
                                        '123,396' 
                                ) 
                        ) 
                ) 
        ),
        'options' => array (
                'nullValueBehaviour' => 'SHOW_IDENTIFIER',
                'contentOutputFormat' => 'HTML' 
        ) 
);

然后:

curl_setopt($ch,CURLOPT_POSTFIELDS,json_encode($post,JSON_PRETTY_PRINT));

代替使用CURLOPT_INFILE。