私の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'));
}
私はまだ検証プロセスの問題がわかりません。このコードはローカルマシン上で問題なく動作していますが、実動サーバーに問題が発生します。
何か?通常、失敗した要求から200が発生する可能性がありますが、適切なエラーコードはスローされません。レスポンスコードの最初の行にhttp_response_code(500)を設定するとよいでしょう。つまり、デフォルトでは200ではなく500になります。 – Shylor
いいえ、ログには何もありません。どこで私はset_http_response(500)を使うべきですか?検証の前に? @shylor – rastemoh