我目前正在尝试解析我通过Chrome中的Postman插件发送的multipart/form-data 。 但是,我得到以下输出:
'------WebKitFormBoundarymsXhoqlRBbTbsZFb Content-Disposition: form-data; name="album_id" 2 ------WebKitFormBoundarymsXhoqlRBbTbsZFb Content-Disposition: form-data; name="description" haiahaahahahdaisdhisadhisadihsdhiiahsd ------WebKitFormBoundarymsXhoqlRBbTbsZFb Content-Disposition: form-data; name="favorite" true ------WebKitFormBoundarymsXhoqlRBbTbsZFb Content-Disposition: form-data; name="uploadfile"; filename="test2.txt" Content-Type: text/plain Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. ------WebKitFormBoundarymsXhoqlRBbTbsZFb Content-Disposition: form-data; name="uploadfile"; filename="test.txt" Content-Type: text/plain Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. ------WebKitFormBoundarymsXhoqlRBbTbsZFb-- '当我尝试调试$this->request->input()时,我得到了这个输出。 当我尝试$this->request->input('json_decode')我得到一个空数组,所以我假设数据格式不正确(只是一个字符串)。 在我编写自己的算法之前,我想确定我不是用这个重新发明轮子。 我做错了什么? 或者如果没有,是否存在一些Cakephp 3函数来处理这个问题?
更新 我发现我的代码出了什么问题,似乎路由过程以某种方式将post数组清空。 当我尝试使用以下端点的Postman http://vecto.app/api/pictures $ this-> request-> data为空。 但是,当我尝试访问端点http://vecto.app/pictures时 ,$ this-> request->数据将填充信息。 有谁知道以下路由设置有什么问题:
Router::prefix('api', function ($routes) { $routes->extensions(['json', 'xml']); $routes->resources('Users'); $routes->resources('Pictures'); // We connect the /register action so we can simply extend the CRUD Plugin add() method // and benefit of already available logic like validation and response codes instead of having to reinvent the wheel. Router::connect('/api/users/register', ['controller' => 'Users', 'action' => 'add', 'prefix' => 'api']); $routes->fallbacks('InflectedRoute'); });I'm currently trying to parse the multipart/form-data that I send through Postman plugin in Chrome. However, I get the following output:
'------WebKitFormBoundarymsXhoqlRBbTbsZFb Content-Disposition: form-data; name="album_id" 2 ------WebKitFormBoundarymsXhoqlRBbTbsZFb Content-Disposition: form-data; name="description" haiahaahahahdaisdhisadhisadihsdhiiahsd ------WebKitFormBoundarymsXhoqlRBbTbsZFb Content-Disposition: form-data; name="favorite" true ------WebKitFormBoundarymsXhoqlRBbTbsZFb Content-Disposition: form-data; name="uploadfile"; filename="test2.txt" Content-Type: text/plain Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. ------WebKitFormBoundarymsXhoqlRBbTbsZFb Content-Disposition: form-data; name="uploadfile"; filename="test.txt" Content-Type: text/plain Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. ------WebKitFormBoundarymsXhoqlRBbTbsZFb-- 'This output do I get when I try to debug $this->request->input(). When I try $this->request->input('json_decode') I get an empty array, so I'm assuming that the data isn't in a proper format (just a string). Before I write my own algorithm I want to be sure that I'm not reinventing the wheel with this one. I'm doing something wrong? Or if not, does there exist some Cakephp 3 function which takes care of this?
Update I found what is wrong in my code and it seems like the routing process somehow empties the post array to early. When I try Postman with the following endpoint http://vecto.app/api/pictures $this->request->data is empty. However, when I try to access the endpoint http://vecto.app/pictures the $this->request->data is filled with the information. Does anyone know what is wrong with the following routing setup:
Router::prefix('api', function ($routes) { $routes->extensions(['json', 'xml']); $routes->resources('Users'); $routes->resources('Pictures'); // We connect the /register action so we can simply extend the CRUD Plugin add() method // and benefit of already available logic like validation and response codes instead of having to reinvent the wheel. Router::connect('/api/users/register', ['controller' => 'Users', 'action' => 'add', 'prefix' => 'api']); $routes->fallbacks('InflectedRoute'); });最满意答案
我终于找到了解决方案,它是一个清空$ this-> request-> data数组的beforeFilter。 因此,输入数组不为空,但数据数组为空。 这是导致问题的代码:
public function beforeFilter(Event $event) { if ($this->request->is('post')) { $data = $this->request; $this->request->data = $this->request->input(function ($data) { return json_decode($data, true); }); } }I finally found the solution which was a beforeFilter that emptied the $this->request->data array. Therefore, the input array wasn't empty but the data array was empty. This is the code that caused the problem:
public function beforeFilter(Event $event) { if ($this->request->is('post')) { $data = $this->request; $this->request->data = $this->request->input(function ($data) { return json_decode($data, true); }); } }更多推荐
发布评论