![](/img/trans.png)
[英]Symfony FOSRestBundle API - receives empty JSON Request body
[英]Fosrestbundle body empty when multipart request
在下面的代碼中,我希望$request->getContents()
獲取HTTP
請求的正文內容。 當發送非多部分請求時,這可以按預期工作,但是當使用多部分請求時, $body
變量保持為空。
public function postDebugAction(Request $request) {
$body = $request->getContent();
if (empty($body)) {
throw new \Exception('Body empty.');
}
return $this->view(array(), 201);
}
在閱讀了這個問題和答案之后,我還添加了一個身體監聽器。
<?php
namespace VSmart\ApiBundle\Listener;
use FOS\RestBundle\EventListener\BodyListener as BaseBodyListener;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use FOS\RestBundle\Decoder\DecoderProviderInterface;
class BodyListener extends BaseBodyListener {
/**
* @var DecoderProviderInterface
*/
private $decoderProvider;
/**
* @param DecoderProviderInterface $decoderProvider Provider for fetching decoders
*/
public function __construct(DecoderProviderInterface $decoderProvider) {
$this->decoderProvider = $decoderProvider;
}
/**
* {@inheritdoc}
*/
public function onKernelRequest(GetResponseEvent $event) {
$request = $event->getRequest();
if (strpos($request->headers->get('Content-Type'), 'multipart/form-data') !== 0) {
return;
}
$format = 'json';
if (!$this->decoderProvider->supports($format)) {
return;
}
$decoder = $this->decoderProvider->getDecoder($format);
$iterator = $request->request->getIterator();
$request->request->set($iterator->key(), $decoder->decode($iterator->current(), $format));
}
}
根據我的PHPUnit測試,當使用Postman
和Advanced Rest Client
模擬請求時,身體似乎再次為空。 我仔細檢查了這個以使用調試器將模擬請求作為PHPUnit運行。 實際上,當通過Rest客戶端模擬時,正文是空的,而當通過PHPUnit運行時,正文是空的。
我使用的測試用例:
POST網址:
http://localhost/EntisServer/web/app_dev.php/api2/debug
頭:
Authorization: Bearer ZGYzYjY1YzY4MGY3YWM3OTFhYTI4Njk3ZmI0NmNmOWZmMjg5MDFkYzJmOWZkOWE4ZTkyYTRmMGM4NTE1MWM0Nw
Content-Type: multipart/form-data; boundary=-----XXXXX
內容:
-----XXXXX
Content-Disposition: form-data; name="json"
Content-Type: application/json; charset=utf-8
{
"blabla": 11
}
-----XXXXX
Content-Disposition: form-data; name="q_3101"; filename="image.jpg"
Content-Type: image/jpeg
contents of a file...
-----XXXXX--
更新我不確定是否在不使用BodyListener
情況下逐步完成調試器。 當我這樣做時,結果完全一樣。 因此,如果沒有BodyListener
,PHPUnit案例會獲取正文,盡管模擬請求仍為空。
請參閱php.net上的php://
wrappers:
注意:在PHP 5.6之前,使用php://輸入打開的流只能讀取一次; 流不支持搜索操作。 但是,根據SAPI實現,可能會打開另一個php://輸入流並重新開始讀取。 只有在保存了請求正文數據后才能執行此操作。 通常,這是POST請求的情況,但不是其他請求方法,例如PUT或PROPFIND。
因此,請更新您的PHP版本或確保您只讀取一次輸入。
在fos_rest.decoder_provider
解碼后,您可以在$request->files->all()
fos_rest.decoder_provider
$request->files->all()
找到上傳的文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.