POST-запрос с файлами и полями в guzzle

Хорошо, я дам небольшую предысторию для начала. У меня есть система A, написанная на CakePHP, которая обрабатывает рекламу, продукты и тому подобное. Недавно я работал над другой системой, написанной на Laravel, которая действует как инструмент самообслуживания для риелторов, позволяющий публиковать и управлять своими списками недвижимости, которые находятся в системе A. Сейчас я нахожусь в точке загрузки изображений из самообслуживания. обслуживать сайт в системе A. Я написал в Cake простое действие контроллера для обработки POST-запроса и сохранения файла изображения на сервере.

http://example.com/image/add

Я могу отправлять запросы POST, загружать изображения и получать правильный ответ, используя приложения REST, такие как postman. Со стороны системы А (торт) все выглядит хорошо.

Теперь в системе самообслуживания в Laravel я использую Guzzle для отправки HTTP-запросов. Я заполнил почтовый запрос на жужжание точно такими же полями и файлами, но не получил такого же результата. Запрос получен системой А, но изображение не добавляется и возвращается случайная HTML-страница. Если почтальон и несколько других приложений получают точно такой же ответ и функциональность, но мой запрос, отправленный в Guzzle, нет, я думаю, что есть проблема с моим запросом guzzle. Вот мой прожорливый код:

$client = new Client();

    // Create the request.
    $request = $client->createRequest("POST", "http://example.com/image/add");

    // Set the POST information.

    $postBody = $request->getBody();
    $postBody->setField('user_id', $userId);
    $postBody->setField('api_key', $token);
    $postBody->setField('product_id', $product_id);
    $postBody->addFile(new PostFile('image[data]', fopen('tmp/images/'.$input->image, 'r')));

    // Send the request and get the response.
    $response = $client->send($request);

Вот рабочий запрос POST от Postman:

POST /image/add HTTP/1.1
Host: example.com
Cache-Control: no-cache

----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="product_id"

1000
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="user_id"

8345
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="api_key"

secretKey
----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="data[image]"; filename="steve-jobs.jpg"
Content-Type: image/jpeg


----WebKitFormBoundaryE19zNvXGzXaLvS5C

Вот жрет запрос на строку, извиняюсь за проблемы с читабельностью.

POST /image/add HTTP/1.1 Host: example.com User-Agent: Guzzle/4.0.2 curl/7.22.0            PHP/5.5.9-1+sury.org~precise+1 Content-Length: 124647 Content-Type: multipart/form-data;   boundary=53a1f21e04080 --53a1f21e04080 Content-Disposition: form-data; name="user_id" 8345 --53a1f21e04080 Content-Disposition: form-data; name="api_key"  secretKey --53a1f21e04080 Content-Disposition: form-data; name="product_id" 1000 --53a1f21e04080 Content-Disposition: form-data; filename="steve-jobs.jpg"; name="image[data]" Content-Type: image/jpeg

Затем куча символов для данных изображения.

Я спрашиваю, может ли кто-нибудь увидеть проблему с моим POST-запросом в guzzle или сталкивался ли кто-нибудь с такой странной проблемой с guzzle раньше.

Изменить: я использую CakePHP 2.4.1


person user3753755    schedule 18.06.2014    source источник
comment
Пожалуйста, всегда указывайте точную версию CakePHP и соответствующим образом отмечайте свой вопрос - спасибо!   -  person ndm    schedule 19.06.2014
comment
Добавлена ​​версия php для торта. Буду иметь это в виду в следующий раз!   -  person user3753755    schedule 19.06.2014
comment
У меня такая же проблема. Вы когда-нибудь придумывали решение?   -  person Mosaic    schedule 07.10.2014
comment
Какая у вас версия Guzzle?   -  person revo    schedule 05.08.2016


Ответы (1)


Насколько я могу судить, это просто небольшая ошибка в имени поля файла, оно должно быть data[image], а не image[data].

new PostFile('data[image]', /* ... */);

В вашем приложении вы, вероятно, полагаетесь на то, что данные файла доступны через CakeRequest::$data, однако они попадут туда только в том случае, если они обернуты в ключ data, в противном случае они будут добавлены в CakeRequest::$params['form'].

На самом деле это не дубликат, однако для справки (более связанной с помощником формы CakePHP) см. Также:

CakePHP: данные опубликованного файла не включены в запросе-›данные

person ndm    schedule 18.06.2014
comment
Спасибо за ваш ответ; это проблема, и я исправил ее. Но моя проблема все еще сохраняется в том, что я не получаю должного ответа. - person user3753755; 19.06.2014
comment
@ user3753755 Вам нужно будет добавить дополнительную информацию, чтобы иметь возможность определить, в чем может быть проблема, например, точный ответ, который вы получаете, соответствующий код контроллера CakePHP и возможные результаты отладки (например, какие именно данные доступны) в CakePHP для вашего показанного запроса). - person ndm; 19.06.2014