我发送的请求包括从angular 4到laravel api的表单数据对象和一些数据......有时请求数据被正确接收,其他时候请求为空"空请求"
这是我的申请详情
Accept:application/json
Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.9
Authorization:Bearer ---------
Connection:keep-alive
Content-Length:973
Content-Type:multipart/form-data; boundary=----WebKitFormBoundarydEkuATdI8JBFdnBM
Host:127.0.0.1:8000
Origin:http://localhost:4200
Referer:http://localhost:4200/shop_admin
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36
请求有效负载
------WebKitFormBoundarydEkuATdI8JBFdnBM
Content-Disposition: form-data; name="business_id"
249
------WebKitFormBoundarydEkuATdI8JBFdnBM
Content-Disposition: form-data; name="maintenance_flag"
0
------WebKitFormBoundarydEkuATdI8JBFdnBM
Content-Disposition: form-data; name="type"
shop
------WebKitFormBoundarydEkuATdI8JBFdnBM
Content-Disposition: form-data; name="name"
qewqweqweqwe
------WebKitFormBoundarydEkuATdI8JBFdnBM
Content-Disposition: form-data; name="website_uri"
------WebKitFormBoundarydEkuATdI8JBFdnBM
Content-Disposition: form-data; name="phone_number"
------WebKitFormBoundarydEkuATdI8JBFdnBM
Content-Disposition: form-data; name="facebook_link"
------WebKitFormBoundarydEkuATdI8JBFdnBM
Content-Disposition: form-data; name="logo_uri"
uploads/businesses/249/249_1.jpg
------WebKitFormBoundarydEkuATdI8JBFdnBM
Content-Disposition: form-data; name="brands"
undefined
------WebKitFormBoundarydEkuATdI8JBFdnBM--
here is a screenshot for request back from laravel into console
- 更新**
这是我代码
角侧:
这里的表单数据对象是Angular 表单数据对象
let formData: FormData = new FormData();
formData.append( 'business_id', that.businessId );
formData.append( 'maintenance_flag', that.maintenance_flag );
formData.append( 'type', edit_type );
formData.append( 'name', name );
formData.append( 'website_uri', website );
formData.append( 'phone_number', phone );
formData.append( 'facebook_link', face );
formData.append( 'logo_uri', that.basicData.logo_uri );
formData.append( 'brands', that.selectedBrands );
if ( pic.files.length > 0 )
formData.append( 'logo_uri', pic.files[ 0 ] );
API:
that.apiService.changeBusiness( formData ).subscribe( ( res ) =>
{
console.log( res );
}
shopUpdate ( shop_basic_info ){
return this.http.post( environment.api_base_url + 'api/shop_update', shop_basic_info ).map( res => res.json() );
}
拉威尔侧
路线
Route::post('/shop_update', 'ShopController@handleUpdate');
控制器文件
public function handleUpdate(Request $request)
{
return $request->all();
}
7条答案
按热度按时间envsm3lx1#
这是PHP的一个问题。
除非请求方法是POST,否则它不会解析多部分表单数据:
https://bugs.php.net/bug.php?id=55815
有许多变通办法,但没有一个是整洁的:
1.使用PATCH/PUT进行最佳实践,或者仅使用POST进行演示场景。
1.如果您不能切换方法,那么只需重新编写代码,不使用Formdata,PHP将正确处理文件。
1.使用POST和add_method发送:放在formData上
(3)就像这样:
twh00eeo2#
我通过JavaScript使用Axios时遇到了这个问题,因为内容类型头部是多部分表单数据,但缺少边界。
根据我的研究,一个好的处理方法是允许Axios自动检测内容类型并自行正确设置标题。
下面是如何实现这一点的一个想法:
上面的代码位于一个通用handleSubmit函数中,可以从客户端的任何位置调用该函数。
下面是函数签名:
在上面的代码中,有两种用例。第一种是默认情况,通过平面对象发送正常的有效负载。第二种是表单包含文件并且需要
multipart/form-data
的情况。在这种情况下,我们使用FormData
对象作为容器,指示Axios自动检测必要的头部并设置正确的边界。如果未正确指定标头,则可能在Laravel中收到空的
$request->all()
Array。我的答案的简短答案是使用
FormData
对象,因为它包含比普通旧JavaScript对象更多的信息。正如我上面的注解所暗示的,使用Dev Tools〉Network标签〉XHR标签检查请求头,并确保常规表单提交的内容类型为
application/json
或application/x-www-form-urlencoded
,如果要上传文件,则为multipart/form-data'
。zf9nrax13#
您必须将CSRF令牌添加到"请求添加:* * 表单数据. append('_token',{{csrf_token()}})**
63lcw9qa4#
1-除非你的路由不在web中间件下,否则你需要这个令牌2-检查post的大小,它可能比最大允许post的大小大...如果它比最大允许post的大小大,你必须在php.ini或.htaccess或函数内部增加最大允许post的大小
ecbunoof5#
请注意,FormData仅适用于POST方法。
@参见PATCH and PUT Request Does not Working with form-data
o7jaxewo6#
检查
php.ini
中的file_uploads
、upload_max_filesize
和post_max_size
指令。fkvaft9z7#
您应该这样使用: