2016-11-15 103 views
2

我的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')); 
} 

我还是不知道验证过程有什么问题。此代码正在我的本地机器上正常工作,但在生产服务器上发生问题。

+0

什么?通常情况下,200可以发生失败的请求,但不会抛出正确的错误代码。将http_response_code(500)设置为响应代码中的第一行可能很好,因此它将默认为500而不是200. – Shylor

+0

不,日志中没有任何内容。我应该在哪里使用set_http_response(500)?验证之前? @shylor – rastemoh

回答

1

我终于明白了。 我已经添加了一个语言文件,并且该文件使用UTF-8-BOM编码,当我将该文件转换为UTF-8而没有BOM时,这些文件变得正确。

该文件为resources/lang/[language] /validation.php,并且由于在处理此文件时发送了头文件的编码问题。

这个问题还帮我找到了问题:在错误日志 Laravel redirect::route is showing a message between page loads