Используя curl для проекта Aria в командном окне, я получаю то, что хочу, но в PHP-файле он возвращает пустую строку - PullRequest
0 голосов
/ 22 ноября 2018

когда я набираю эту команду в 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 дата: чт, 22 ноября 2018 09:45:27 GMTтип содержимого: application / json; charset = UTF-8 сервер: nginx

[{"errorType": null, "errorMessage": null, "warnings": [], "result": "

Площадь штата Виктория составляет 227 416 кв. Км, а население в 2016 году - 5 938 100 человек, что на 7,04% больше, чем в 2010 году - 5 547 500 человек. Население столицы Мельбурна составляет 4 353 514 человек, что на 10,11% больше, чем в 2010 году.3953 939, и представляет 73,31% населения штата.

Премьер-министр, Даниэль Эндрюс (ALP), в его первый срок.


"," wordCount ":60}, {"errorType": null, "errorMessage": null, "warnings": [], "result": "

Площадь Австралийской столицы составляет 2 358 квадратных километров, а в 2016 году население составляет 390 800 человек, что на 8,89% выше показателя 2010 года в 358 900 человек. Население столицы Канберры составляет 424 666 человек, что на 6,58% больше, чем в 2010 году.не 398 430, и представляет 73,31% населения штата.

Премьер-министр, Эндрю Барр (ALP), в его первый срок.


"," wordCount": 63}, {" errorType ": null," errorMessage ": null," warnings ": []," result ":"

Площадь северной территории составляет 1 349 129 квадратных километров, а население в 2016 году составляет244 600, что на 6,49% больше показателя 2010 года в 229 700.Население столицы Дарвина составляет 123 396 человек, что на 9,21% больше, чем в 2010 году, когда насчитывалось 112 987 человек, и составляет 73,31% населения штата.

Премьер-министр Майкл Ганнер (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 для 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 голосов
/ 22 ноября 2018

не используйте метод @ с оболочкой libcurl в php, он устарел в 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 отправлял json в теле сообщения так же, как это делает ваш вызов cli, передайте необработанную строку 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.

...