使用内容类型张贴:多部分/表单数据导致请求正文为空


POSTing with Content-Type: multipart/form-data results in empty request body

最近,当我用Content-Type: multipart/form-data发布到REST接口时,开始出现验证错误。Content-Type: application/x-www-form-urlencoded正在工作。

这是我的测试功能:

/**
 * @Rest'Route("/testtype")
 */
public function postTypeTestAction()
{
    $request = $this->getRequest()->request->all();
    $phpContents = file_get_contents("php://input");
    return FOSView::create()->setStatusCode(200)->setData(array('request'=>$request, 'phpinput' => $phpContents));
}

当我使用Content-Type: application/x-www-form-urlencoded: POST时

{
  "request":{
    "test":"message"
   },
  "phpinput":"test=message"
}

当我使用Content-Type: multipart/form-data: POST时

{
  "request":[
  ],
 "phpinput":"------WebKitFormBoundaryFyQqAxqqfuhWzHUq'r'nContent-Disposition: form-data; name='"test'"'r'n'r'nmessage'r'n------WebKitFormBoundaryFyQqAxqqfuhWzHUq--'r'n"

}

由于没有请求数据,我收到了This value should not be blank验证错误。这破坏了我的应用程序。我盯着这个看了这么久,我确信我错过了一些简单的东西。

我使用的是Symfony 2.3.7和FOSRestBundle 1.0.0。

这个问题一夜之间就解决了。没有重新启动服务器,没有更改代码,我使用相同的工具进行测试(DHC by Restlet-Chrome扩展)。然而,由于这在开发环境和暂存环境中都不起作用,现在在这两个环境中都起作用,所以我唯一的答案是测试工具Chrome、本地缓存问题或某种组合。

经验教训:使用多种测试工具。

现在,当我使用Content-Type: application/x-www-form-urlencoded:进行POST时

{
  "request":{
    "test":"message"
   },
  "phpinput":"test=message"
}

现在,当我使用Content-Type: multipart/form-data:进行POST时

{
  "request":{
    "test":"message"
   },
  "phpinput":""
}