2015-04-10 2 views
0

Я хочу, чтобы отправить данные в формате JSON через PUT на службу REST, используя следующий код PHP:результатов PHP Curl в недопустимую JSON

$data = '{"api_key":"my-api-key","post":{"exception":["2015-04-10T11:09:51+00:00 ERR (3):\\nexception 'Exception' with message 'a simple exception' in \/private\/var\/www\/index.php:1\\nStack trace:\\n#0 {main}"],"access":["::1 - - [10\/Apr\/2015:13:08:17 +0200] \"GET \/index.php HTTP\/1.1\" 200 19039"]}}'; 
$curl = curl_init($url); 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT"); 

curl_setopt($curl, CURLOPT_POSTFIELDS, $data); 
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json', 
    'Content-Length: ' . strlen($data)) 
); 

$response = curl_exec($curl); 

Как вы можете видеть, что я отправить действительный JSON (подкрепленную http://jsonlint.com/). На стороне службы я получаю следующий json:

{"api_key":"my-api-key","post":{"exception":["2015-04-10T11:09:51+00:00 ERR (3):\\\\nexception \'Exception\' with message \'a simple exception\' in \\/private\\/var\\/www\\/index.php:1\\\\nStack trace:\\\\n#0 {main}"],"access":["::1 - - [10\\/Apr\\/2015:13:08:17 +0200] \\"GET \\/index.php HTTP\\/1.1\\" 200 19039"]}} 

В подтверждение этого говорится, что у меня была ошибка синтаксического анализа. И это кажется правильным, поскольку я не могу понять, почему дальнейшее ускорение сделано, как \\\\n. Что я здесь делаю неправильно?

+2

Не создавайте json вручную, используйте 'json_encode()'; – Steve

+0

Эта ссылка может помочь вам http://stackoverflow.com/questions/27440171/how-to-send-a-post-request-to-the-restserver-api-in-php-codeigniter – Madhu

+0

Я не создавал ее вручную , конечно, я использую 'json_encode()', но для этого вопроса я опустил сложный массив. Но строка json - это, безусловно, вывод 'json_encode()'. Ссылка, которую вы разместили, не имеет ничего другого, что я использовал в моем вопросе. – tester

ответ

0

Я сомневаюсь, что это действительное использование PUT и должно быть POST, но это просто техничность. Если это возможно, сделайте это ПОЧТА. Вероятно, PUT является корнем проблемы.

CURLOPT_PUT использует CURLOPT_INFILECURLOPT_INFILESIZE и

URLOPT_CUSTOMREQUEST должен работать нормально, но появится у вас есть некоторый RFC 3986 спасаясь происходит по какой-то необъяснимой причине.

Возможно, вы хотите использовать rawurldecode () со стороны обслуживания.
Это даст вам (кажется правильным, но я не тот парень, чтобы проверить):

{"api_key":"my-api-key","post":{"exception":["2015-04-10T11:09:51+00:00 ERR (3):\\nexception 'Exception' with message 'a simple exception' in \/private\/var\/www\/index.php:1\\nStack trace:\\n#0 {main}"],"access":["::1 - - [10\/Apr\/2015:13:08:17 +0200] \"GET \/index.php HTTP\/1.1\" 200 19039"]}} 

Отказ от ответственности: Я никогда не использовал локон для POST Content-Type: application/json данных.

Вам нужно посмотреть заголовок запроса и, возможно, ответ. Было бы интересно узнать, получаете ли вы правильный ответ PUT.

curl_setopt($ch, CURLOPT_HEADER, true); 
    curl_setopt($ch, CURLINFO_HEADER_OUT, true); 

Проверьте заголовок запроса Content-Type

Чтобы получить заголовки:

Отклик заголовок будет в возвращаемом передачи.
Заголовок запроса будет находиться в curl_getinfo()
Информация об curl также будет включать в себя статус ответа HTTP. Что для PUT должно быть 201 или 301, но не важно.

$data = curl_exec($ch); 
    $skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE)); 
    $responseHeader = substr($data,0,$skip); 
    $data= substr($data,$skip); 
    $info = var_export(curl_getinfo($ch),true); 
    echo $responseHeader . $info . $data; 

Если вы все еще хотите отправить JSON без завитка избежать этого у меня есть кое-какие мысли на этот счет. но, вероятно, здесь есть место на этом предмете.

+0

Если вы найдете решение без 'rawurldecode()', напишите об этом. – Misunderstood

+0

Большое спасибо за вашу информацию, я попробую это.На самом деле нет решения, так как меня обманули результатом 'var_export()', который добавил дополнительное экранирование. См. Мой комментарий выше для этого :-) – tester

+1

Используйте var_dump, когда в выводе есть слэш. – Misunderstood