Guzzle not sending PSR-7 POST body correctly

后端 未结 2 837
北恋
北恋 2021-02-08 15:33

It is either not being sent, or not being received correctly. Using curl direct from the command line (using the -d option) or from PHP (using CURLOPT_POSTFIELDS) d

2条回答
  •  南旧
    南旧 (楼主)
    2021-02-08 16:08

    The Content-Type header was the issue. Normally, Guzzle will hold your hand and insert headers it deems necessary, and makes a good guess at the Content-Type based on what you have given it, and how you have given it.

    With Guzzle's PSR-7 messages, none of that hand-holding is done. It strictly leaves all the headers for you to handle. So when adding POST parameters to a PSR-7 Request, you must explicitly set the Content-Type:

    $params = ['Foo' => 'Bar'];
    $body = \GuzzleHttp\Psr7\stream_for(http_build_query($params));
    $request = $request->withBody($body);
    $request = $request->withHeader('Content-Type', 'application/x-www-form-urlencoded');
    

    The ability to pass in the params as an array and to leave Guzzle to work out the rest, does not apply to Guzzle's PSR-7 implementation. It's a bit clumsy, as you need to serialise the POST parameters into a HTTP query string, and then stick that into a stream, but there you have it. There may be an easier way to handle this (e.g. a wrapper class I'm not aware of), and I'll wait and see if any come up before accepting this answer.

    Be aware also that if constructing a multipart/form-data Request message, you need to add the boundary string to the Content-Type:

    $request = $request->withHeader('Content-Type', 'multipart/form-data; boundary=' . $boundary);
    

    Where $boundary can be something like uniq() and is used in construction the multipart body.

提交回复
热议问题