我的webapp将Laravel作为后端框架,它提供了一个Restful API并且在Angularjs正在运行。 我通过API发送不同的请求并接收响应,并根据响应代码和包含的数据向用户显示适当的消息。Laravel与Angularjs验证json请求不良响应
最近,当我使用PUT方法或POST方法发送请求时,当数据在验证过程中出现问题并且Laravel应该以JSON格式响应422代码时,我接收到代码为200的text/html响应。一切都出错了。
这不会发生在我的本地机器上,只有当我在生产环境中测试应用程序时,才会发生这种情况。
我还测试了与403代码一起发送的未经授权的响应,它的工作原理完美无瑕。我测试了Laravel的自动验证错误(如文档中所述:在AJAX请求期间使用validate方法时,Laravel不会生成重定向响应,相反,Laravel生成一个包含所有验证错误的JSON响应。
return response()->json(compact('errors'),422);
我要指出,我用下面的方法来发送AJAX请求:
function save(data, url) {
return $http({
method: 'POST',
url: url,
headers: {'Content-Type': 'application/json'},
data: angular.toJson(data)
});
}
function update(data, url) {
return $http({
method: 'PUT',
url: url + data.id,
headers: {'Content-Type': 'application/json'},
data: angular.toJson(data)
});
}
这JSON响应将有422 HTTP状态代码,使用下面的方法来发送)和也。不用说我变得完全困惑!
UPDATE:这似乎是与Laravel验证过程中的问题。当验证运行时,请求会变得错误。看下面这段代码:
public function altUpdate(Request $request){
$this->authorize('editCustomer', $this->store);
if (!$request->has('customer')){
return response()->json(["message"=>"Problem in received data"],422);
}
$id = $request->customer['id'];
$rules = [
'name' => 'required',
'mobile' => "required|digits:11|unique:customers,mobile,$id,id,store_id,$this->store_id",
'phone' => 'digits_between:8,11',
'email' => "email|max:255|unique:customers,email,$id,id,store_id,$this->store_id",
];
//return response()->json(["problem in data"],422); //this one works properly if uncommented
$validator = Validator::make($request->customer,$rules);
if ($validator->fails()){
$errors = $validator->errors()->all();
Log::info($errors);
return response()->json(["problem in data"],422);//this one is received in client side as a text/html response with code 200
}
$customer = Customer::find($id);
$customer->update(wrapInputs($request->all()));
if ($request->tags) {
$this->syncTags($request->tags, $customer);
}
$message = "Customer updated successfully!";
return response()->json(compact('message'));
}
我还是不知道验证过程有什么问题。此代码正在我的本地机器上正常工作,但在生产服务器上发生问题。
什么?通常情况下,200可以发生失败的请求,但不会抛出正确的错误代码。将http_response_code(500)设置为响应代码中的第一行可能很好,因此它将默认为500而不是200. – Shylor
不,日志中没有任何内容。我应该在哪里使用set_http_response(500)?验证之前? @shylor – rastemoh