2016-11-15 63 views
2

私のWebアプリケーションは、RESTfulなAPIを提供してAngularjsが実行されているfronendにおけるバックエンドのフレームワークとしてLaravelを持っています。 私はAPIを介してさまざまなリクエストを送信し、レスポンスを受信し、レスポンスのコードとデータに基づいて、適切なメッセージがユーザーに表示されます。Laravel悪い応答

最近、PUTメソッドまたはPOSTメソッドを使用してリクエストを送信すると、データに検証プロセスで問題があり、LaravelがJSON形式の422コードで応答する必要がありますが、コード200のtext/html応答が返されます。すべてが間違っています。

これは、私はこの問題が発生した運用環境でアプリケーションをテストする場合にのみ、私のローカルマシン上では発生しません。

私はまた、403のコードで送信され、不正な応答をテストし、それが完璧に動作します。

ドキュメントで説明されているように、Laravelの自動検証エラーと、AJAXリクエスト中にvalidateメソッドを使用すると、Laravelはリダイレクトレスポンスを生成しません。代わりに、Laravelはすべての検証エラーを含むJSON応答を生成します。私はAJAXリクエストを送信するには、次の方法を使用することを言及する必要があります

return response()->json(compact('errors'),422); 

::。このJSONレスポンスは422のHTTPステータスコードを送信される)と、以下の方法を使用することになります

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) 
     }); 
    } 

言うまでもなく私は完全に混乱した!


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)を設定するとよいでしょう。つまり、デフォルトでは200ではなく500になります。 – Shylor

+0

いいえ、ログには何もありません。どこで私はset_http_response(500)を使うべきですか?検証の前に? @shylor – rastemoh

答えて

1

私はついにそれを得ました。 言語ファイルを追加しましたが、ファイルがUTF-8-BOMでエンコードされました。そのファイルをBOMなしのUTF-8に変換すると、正しいものになりました。

ファイルは、リソース/ LANG/[言語] /validation.phpであり、このファイルを処理している間に符号化の問題のため、ヘッダが送信されていました。

この質問はまた、問題を見つけるために私を助けた:エラーログで Laravel redirect::route is showing a message between page loads

関連する問題