Symfony 3.4+Guzzle 5.3 POST请求失败,调试请求体为空
解决Guzzle 5.3异常中Request Body为空的问题
问题原因
Guzzle 5.3中请求的Body基于流对象实现,当请求发送时,Guzzle会读取一次流内容,此时流指针会移动到末尾。异常捕获时再次调用getBody()->getContents(),由于指针已在末尾,自然返回空内容。
解决方法
1. 重置流指针后读取
在读取Body内容前,先调用seek(0)将流指针重置到起始位置,再读取内容:
try { // 发起POST请求的逻辑 } catch (\GuzzleHttp\Exception\RequestException $e) { $request = $e->getRequest(); $body = $request->getBody(); $body->seek(0); // 重置流指针到开头 $originalBody = $body->getContents(); // 此时$originalBody即为原始请求Body内容 }
2. 提前保存请求Body副本
在构建请求前,先将序列化后的JSON字符串保存一份,异常时直接使用该副本,无需从Request对象中读取:
// 序列化对象为JSON字符串 $jsonBody = $serializer->serialize($yourObject, 'json'); // 构建请求 $request = $client->createRequest('POST', '/target-url', [ 'body' => $jsonBody ]); try { $response = $client->send($request); } catch (\GuzzleHttp\Exception\RequestException $e) { // 直接使用提前保存的$jsonBody var_dump($jsonBody); }
3. 确认请求参数配置正确
确保请求的Body参数使用body而非json:Guzzle 5.3的json参数会自动对传入的数组进行JSON编码,若你已经手动序列化了JSON字符串,使用json参数会导致重复编码,可能引发请求异常,同时也会导致从Request中读取的Body不符合预期。
内容的提问来源于stack exchange,提问作者KodeFor.Me
相关产品推荐
相关产品推荐

