2015-08-27 15 views
1

为什么当我尝试在Postman上测试Zend Framework 2中的PUT方法时,我必须使用x-www-form-urlencoded选项?为什么Zend Framework 2使用application/x-www-form-urlencoded进行put请求?

/* 
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选项吗?

回答

2

问题是form-data在PUT请求中不能很好地工作在PHP中。这与ZF2无关,例如Symfony2或Slim也是如此。对于POST请求,这不是问题,因为PHP的内部解析数据为你提供并在$_POST中提供。

这里的情况是解析表单数据不是微不足道的。边界的基本部分和分割多个键/值很容易。二进制数据尤其是存在的所有边缘条件变得越来越困难。并不是说你想要基于流的解析,而是将整个字符串加载到内存中,这是非常庞大的机构。

因此,请尝试使用urlencoded body,或编写自己的表单数据解析器。不幸的是,这是唯一的两种选择。

+0

'尝试使用urlencoded主体,或者编写自己的表单 - 数据分析器。“我可以从任何示例和指南开始? – laukok

+1

一个非常小的例子,没有包含所有可能的结果可以在这里找到:http://www.chlab.ch/blog/archives/php/manually-parse-raw-http-data-php另一个更复杂的是拒绝公关在symfony,与所有讨论为什么这不是这个好主意:https://github.com/symfony/symfony/pull/10381#issuecomment-38717986 –

相关问题