PHP Guzzle. Как установить настраиваемую границу для составного запроса POST?

Как установить настраиваемую границу для составного запроса POST? Конфигурация следующих параметров запроса не работает.

'headers' => ['Content-Type' => 'multipart/form-data; boundary=CUSTOM_BOUNDARY']

person tooleks    schedule 21.06.2015    source источник
comment
Есть ли конкретная причина, по которой вы должны это делать?   -  person mario    schedule 21.06.2015
comment
Да, это. API, который я должен использовать, требует этого.   -  person tooleks    schedule 21.06.2015
comment
Звучит маловероятно. Пожалуйста, цитируйте официальную документацию этого API.   -  person mario    schedule 21.06.2015
comment
Да, знаю =) Но иначе получаю ошибку: Content-Type не содержит параметра границы. Документы по API.   -  person tooleks    schedule 21.06.2015
comment
вам следует проверить эту ссылку   -  person Noman    schedule 21.06.2015
comment
Спасибо, проверил. Проблема в том, что я не могу установить пользовательские границы в разделе тела запроса (Жрать многостраничный запрос Документы). Вот еще вопрос: как я могу установить тело RAW HTTP для запроса с помощью Guzzle?   -  person tooleks    schedule 21.06.2015


Ответы (2)


Guzzle использует psr7 для объединения составных полей формы в тело запроса. Самый правильный способ справиться с настраиваемой границей - использовать GuzzleHttp \ Psr7 \ MultipartStream.

$boundary = 'my_custom_boundary';
$multipart_form = [
    [
        'name' => 'upload_id',
        'contents' => $upload_id,
    ],
    [
        'name' => '_uuid',
        'contents' => $uuid,
    ],
    ...
];

$params = [
    'headers' => [
        'Connection' => 'close',
        'Content-Type' => 'multipart/form-data; boundary='.$boundary,
    ],
    'body' => new GuzzleHttp\Psr7\MultipartStream($multipart_form, $boundary), // here is all the magic
];

$res = $this->client->request($method, $url, $params);
person Leonid    schedule 09.11.2016

У меня такая же ошибка, вот как я ее решаю.

//encode field
$field_string = json_encode($field_data);
//read file
$file_string = Flysystem::read($config['doc_path']);
// hack, request body, inject field and file into requet body, set boundary
$request_body =
  "\r\n"
  ."\r\n"
  ."--customboundary\r\n"
  ."Content-Type: application/json\r\n"
  ."Content-Disposition: form-data\r\n"
  ."\r\n"
  ."$field_string\r\n"
  ."--customboundary\r\n"
  ."Content-Type:application/pdf\r\n"
  ."Content-Disposition: file; filename=".$config['deal_name'].";documentid=".$config['deal_id']." \r\n"
  ."\r\n"
  ."$file_string\r\n"
  ."--customboundary--\r\n"
  ."\r\n";

//create request, boundary is required for docusign api
 $result = $this->client->createRequest('POST',"$this->baseUrl/templates", [
'headers' => [
    'Content-Type' => 'multipart/form-data;boundary=customboundary',
    'Content-Length' => strlen($request_body),
    'X-DocuSign-Authentication' => json_encode([
        'Username' => Config::get('docusign.email'),
        'Password' => Config::get('docusign.password'),
        'IntegratorKey' => Config::get('docusign.integratorKey')
    ]),
   ],
  'body' => $request_body
]);
person nsulistiyawan    schedule 01.02.2016