为什么 Zend Framework 2 使用 application/x-www-form-urlencoded 作为 put 请求?
Why does Zend Framework 2 use application/x-www-form-urlencoded for put request?
为什么我在 Postman 上尝试测试 Zend Framework 2 中的 PUT 方法时必须使用 x-www-form-urlencoded
选项?
/*
Use multipart/form-data for testing.
*/
public function create($data)
{
$form = new AlbumForm();
$album = new Album();
$form->setInputFilter($album->getInputFilter());
$form->setData($data);
if ($form->isValid()) {
$album->exchangeArray($form->getData());
$id = $this->getAlbumTable()->saveAlbum($album);
}
return new JsonModel(array(
'data' => $album->extract(),
));
}
/*
Use application/x-www-form-urlencoded for testing.
*/
public function update($id, $data)
{
$data['id'] = $id;
$album = $this->getAlbumTable()->getAlbum($id);
$form = new AlbumForm();
$form->bind($album);
$form->setInputFilter($album->getInputFilter());
$form->setData($data);
if ($form->isValid()) {
$id = $this->getAlbumTable()->saveAlbum($form->getData());
}
return new JsonModel(array(
'data' => $album->extract(),
));
}
如果我得到 form-data
选项,我会得到这个结果,
Array
(
[------WebKitFormBoundaryP9erwzQtIaB0m0tr
Content-Disposition:_form-data;_name] => "title"
bla bla bla bla xxx
------WebKitFormBoundaryP9erwzQtIaB0m0tr
Content-Disposition: form-data; name="artist"
xxx xxx
------WebKitFormBoundaryP9erwzQtIaB0m0tr--
)
我不明白为什么 Zend2 这么期望。有任何想法吗?使用 x-www-form-urlencoded
比 form-data
有什么优势 - 那么在 Zend2 上下文中?
我可以在 Zend2 的某处配置它以使用 PUT 方法的 form-data
选项吗?
问题是表单数据在 PHP 中不能很好地处理 PUT 请求。这与 ZF2 无关,例如 Symfony2 或 Slim 也是如此。对于 POST 请求,这不是问题,因为 PHP 有内部机制为您解析数据并在 $_POST
.
中提供
这里的情况是解析表单数据并不简单。边界和拆分多个 key/values 的基本部分很容易。对于二进制数据,尤其是存在的所有边缘条件,它变得更加困难。不是说你更愿意基于流的解析而不是将整个字符串加载到内存中的令人难以置信的大主体。
因此,请尝试使用 urlencoded 正文,或编写您自己的表单数据解析器。不幸的是,这些是唯一的两个选择。
为什么我在 Postman 上尝试测试 Zend Framework 2 中的 PUT 方法时必须使用 x-www-form-urlencoded
选项?
/*
Use multipart/form-data for testing.
*/
public function create($data)
{
$form = new AlbumForm();
$album = new Album();
$form->setInputFilter($album->getInputFilter());
$form->setData($data);
if ($form->isValid()) {
$album->exchangeArray($form->getData());
$id = $this->getAlbumTable()->saveAlbum($album);
}
return new JsonModel(array(
'data' => $album->extract(),
));
}
/*
Use application/x-www-form-urlencoded for testing.
*/
public function update($id, $data)
{
$data['id'] = $id;
$album = $this->getAlbumTable()->getAlbum($id);
$form = new AlbumForm();
$form->bind($album);
$form->setInputFilter($album->getInputFilter());
$form->setData($data);
if ($form->isValid()) {
$id = $this->getAlbumTable()->saveAlbum($form->getData());
}
return new JsonModel(array(
'data' => $album->extract(),
));
}
如果我得到 form-data
选项,我会得到这个结果,
Array
(
[------WebKitFormBoundaryP9erwzQtIaB0m0tr
Content-Disposition:_form-data;_name] => "title"
bla bla bla bla xxx
------WebKitFormBoundaryP9erwzQtIaB0m0tr
Content-Disposition: form-data; name="artist"
xxx xxx
------WebKitFormBoundaryP9erwzQtIaB0m0tr--
)
我不明白为什么 Zend2 这么期望。有任何想法吗?使用 x-www-form-urlencoded
比 form-data
有什么优势 - 那么在 Zend2 上下文中?
我可以在 Zend2 的某处配置它以使用 PUT 方法的 form-data
选项吗?
问题是表单数据在 PHP 中不能很好地处理 PUT 请求。这与 ZF2 无关,例如 Symfony2 或 Slim 也是如此。对于 POST 请求,这不是问题,因为 PHP 有内部机制为您解析数据并在 $_POST
.
这里的情况是解析表单数据并不简单。边界和拆分多个 key/values 的基本部分很容易。对于二进制数据,尤其是存在的所有边缘条件,它变得更加困难。不是说你更愿意基于流的解析而不是将整个字符串加载到内存中的令人难以置信的大主体。
因此,请尝试使用 urlencoded 正文,或编写您自己的表单数据解析器。不幸的是,这些是唯一的两个选择。