我发送请求包括表格数据对象,其中一些数据从角度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
更新
这是我的代码
表单数据对象 这是角形式数据对象
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 ] );
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();
}
答案 0 :(得分:10)
这是PHP的问题。
除非请求方法为POST,否则它不会解析多部分表单数据:
https://bugs.php.net/bug.php?id=55815
解决方案:
有许多解决方法,但没有一个很整洁,但是:
使用PATCH / PUT进行最佳实践,或者仅将POST用于演示方案。
如果您无法切换方法,则只需不使用Formdata而重新编写代码,PHP就会正确处理该文件。
发送POST并在formData上添加_method:put
(3)像这样:
formData.append('_method', 'PUT')
答案 1 :(得分:0)
您必须在请求中添加CSRF令牌 添加: formData.append('_token',{{csrf_token()}});
答案 2 :(得分:0)
1-您需要令牌,除非您的路由不在Web中间件下 2-检查帖子大小可能大于允许的最大帖子大小...如果更大,则必须在php.ini或.htaccess或函数内部增加允许的最大帖子大小
答案 3 :(得分:0)
我通过JavaScript遇到了Axios的问题,因为内容类型标头是多部分形式数据,但是缺少边界。
根据我的研究,处理该问题的一种好方法是允许Axios自动检测内容类型并正确设置标头本身。
这是实现此目的的一种方法:
const formDataWithFiles = hasFiles ? new FormData() : undefined;
if (formDataWithFiles) {
// axios will automatically set the content-type to multipart/form-data if the
// data param is a FormData object
// otherwise, it will use application/json
// (study the Dev Tools > Network tab > XHR tab headers)
Object.keys(modifiedFields)
.forEach(field => formDataWithFiles.append(field, modifiedFields[field]));
}
const { data } = await axios({
method,
url: actionUrl,
data: hasFiles ? formDataWithFiles : modifiedFields,
headers: {
...axios.defaults.headers,
...headers,
},
});
return data;
上面的代码在通用的handleSubmit函数中,可以从客户端的任何位置调用该函数。
这是函数签名:
const { data } = await this.submitForm({
actionUrl: this.actionUrl,
method: this.method,
modifiedFields: {
...this.modifiedUser,
},
hasFiles: true,
});
在上面的代码中,有两个用例。第一种是默认情况,即通过平面对象发送常规有效负载。第二种情况是表单包含文件并且您需要multipart/form-data
。在这种情况下,我们使用FormData
对象作为容器来指示Axios自动检测必要的标头并设置正确的边界。
如果您未正确指定标题,则可能会在Laravel中收到一个空的$request->all()
数组。
我的答案的简短答案是使用FormData
对象,因为它比普通的JavaScript对象包含更多的信息。有了它,您还可以访问:
const formData = new FormData();
console.log('boundary:', formData._boundary);
正如上面的注释所提示的那样,请使用 Dev Tools>网络标签> XHR标签检查您的请求标头,并确保您的内容类型为application/json
或{{1} }(用于常规格式提交),如果您正在上传文件,则application/x-www-form-urlencoded
。
答案 4 :(得分:0)
在file_uploads
中检查upload_max_filesize
,post_max_size
,php.ini
指令。
答案 5 :(得分:0)
您应该这样使用:
$request->file('filename')