guzzle,如何在multipart / form-data中强制内容类型

时间:2017-06-22 16:21:29

标签: php rest curl multipartform-data guzzle

我是Guzzle的新手,我正在尝试发出REST请求来签署PDF文件。提供者说:

  • 您需要使用BASIC身份验证
  • 请求必须是POST请求
  • mimetype应为multipart / form-data
  • 发送的文件必须是application / octet-stream,其名称应为“file”
  • 发送的数据必须是application / json,其名称应为“data”

系统返回一个响应,其中包含已签名的PDF文件,类型为application / octet-stream

这是我用Guzzle测试的代码,但是提供者说应用程序/ pdf中发送的类型mime。如何“强制”PDF文件的mimetype?

$client = new Client([
    'auth' => ['login', 'password'],
    'debug' => true,
    'curl'  => [
                  CURLOPT_PROXY => '192.168.1.232',
                  CURLOPT_PROXYPORT => '8080',
                  CURLOPT_PROXYUSERPWD => 'username:password',
             ],
]);
$boundary = 'my_custom_boundary';
$multipart = [
            [
                'name'     => 'data',
                'contents' => "{'nomDocument':'documentTest.pdf','externalid':'123456'}",
                'Content-Type'  => 'application/json'
            ],
            [
                'name'     => 'file',
                'contents' => fopen('documentTest.pdf', 'r'),
                'Content-Type'  => 'application/octet-stream'
            ],
        ];

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

try{
    $response = $client->request('POST', 'https://server.com/api/sendDocument', $params);
} catch (RequestException $e) {
    echo Psr7\str($e->getRequest());
    if ($e->hasResponse()) {
        echo Psr7\str($e->getResponse());
    }
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您必须在标题中传递Content-Type

$multipart = [
        [
            'name'     => 'data',
            'contents' => "{'nomDocument':'documentTest.pdf','externalid':'123456'}",
            'headers'  => [ 'Content-Type' => 'application/json']
        ],
        [
            'name'     => 'file',
            'contents' => fopen('documentTest.pdf', 'r'),
            'headers'  => [ 'Content-Type' => 'application/octet-stream']
        ],
    ];
Guzzle Documentation中的

表示您可以为每个多部分数据指定标头。 如果你没有设置标题,Guzzle会根据文件为你输入一个Content-Type。