当我在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"
}
}
答案 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。