2017-02-21 18 views
2

Мне нужно воссоздать это в PHP:перевод «данные-двоичный» из Curl в PHP

curl -X POST --user <username>:<password> 
--header "Content-Type: text/plain;charset=utf-8" 
--header "Accept: application/json" 
--data-binary @<filename> 
"https://gateway.watsonplatform.net/personality-insights/api/v3/profile" 

Я получил это:

$request_headers = array(); 
$request_headers[] = 'Content-Type: text/plain;charset=utf-8'; 
$request_headers[] = 'Content-Language: en'; 
$request_headers[] = 'Accept-Language: en'; 

$simple_data = 'washingtonpost by the intelligence community'; 
    curl_setopt_array($ch2, array(
     CURLOPT_POST => 1, 
     CURLOPT_POSTFIELDS => $simple_data, 
     CURLOPT_HEADER => $request_headers, 
     CURLOPT_USERPWD => 'XXXX:YYYY', 
    ) 
    ); 
    $response2 = curl_exec($ch2); 

Что мой код не учитывает это часть --data-binary, но я не уверен, как «перевести» это на PHP. Кроме того, можно ли использовать двоичный код данных с открытым текстом (API принимает его) вместо JSON?

+1

В вашем коде 'CURLOPT_HEADER' должен быть' CURLOPT_HTTPHEADER' для установки заголовков запросов. В противном случае POSTFIELDS является правильным, как и в пользовательском Content-Type. – drew010

+0

@ drew010 Это была именно эта проблема! Спасибо! Если вы представите в качестве ответа, я могу согласиться. Ценить это. – jonmrich

ответ

2

У вас уже есть эквивалент --data-binary. См. CURLOPT_POSTFIELDS API docs:

Вы должны убедиться, что данные отформатированы так, как вы хотите, чтобы сервер их получал. libcurl не будет конвертировать или кодировать его для вас каким-либо образом.

Сравните это к docs for the command-line --data-binary option:

Эти сообщения данных точно так, как указано без дополнительной обработки вообще.

Что касается второй части вашего вопроса:

можно использовать двоичные данные с простым текстом (API принимает его) вместо JSON

Да, как для --data-binary из командной строки и CURLOPT_POSTFIELDS из API.

+0

Спасибо ... это дает мне ошибки 415 Unsupported Media Type, которые я не могу отследить, учитывая очень простую строку, которую я пытаюсь отправить в этом примере. – jonmrich

+0

Я бы подумал, что '415 Unsupported Media Type' - это просто сервис, рассматривающий заголовок' Content-Type: text/plain' и говорящий, что он не поддерживает это (хотя почему я не знаю, так как ваш вопрос указывает на необходимость). Я предполагаю, что изменить это на 'application/json' и повторить попытку будет то, что нужно сделать (если вы еще этого не сделали). Но, насколько я понимаю, 415 не вызвано какой-либо ошибкой в ​​том, что отправляет ваш код libcurl. – sideshowbarker

+0

Я использую то же самое, используя CLI, и работает отлично. Есть ли что-то, что меняет (или не изменяет) в переводе, который мне не хватает? – jonmrich