2017-04-19 2 views
0

私は2つのLaravelアプリケーションを持ち、1つはLaravelアプリケーションからもう1つはAPIを呼び出しています。別のLaravelアプリケーションからLaravelエラーをキャッチするにはどうすればよいですか?

要求しているアプリケーションが無効なデータを送信した場合、APIはLaravelの「中断」機能を呼び出します。

しかし、私は要求側のアプリケーション側でこのエラーを検出できないようです。ここではいくつかのコードは次のとおりです。

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

if ($method == 'POST') { 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));  
} 

$result = curl_exec($ch); 

Log::info($result); 

curl_close($ch); 

そして、私の受信アプリケーション:アプリケーションの要求

if ($result == '') { 
    $error = 'An unexpected error occurred fetching shipping rates. If this error persists, please contact support.'; 
    abort(400, $error, array('errorText'=>$error)); 
    $error = true; 
} 

を、そのアプリケーションが既にあるとして、私は特に、私の受信アプリケーションのエラー処理を変更することはできませんこれらのエラーメッセージを適切に処理します。

私の要求するアプリケーションでは、Log::info呼び出しの結果は、エラーコードが深く埋め込まれたHTML全体です。

カスタム文字列解析を行わないとそのメッセージが表示されないようですが、失敗したことを知り、そのエラーメッセージを取得する方法があるはずです。

どのような考えですか?

答えて

0

あなたは、例外をキャッチすることはできませんが、異なるステータスコードが返されたために、あなたは別のロジックを追加することができ、この場合には、より一般的な方法でこれを処理する方法400

$statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
if ($statusCode == 400) { 
    // Do things 
} 

はまで実際にありますAPIをどのように動作させるかを指定します。たとえば、APIに承認を追加し、誰かが無効な資格情報を渡す場合は、abort(401)が不許可を意味するとします。ここにステータスコードのリストとそれらが意味するものを見ることができます... https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

あなたがこのサービスを消費する唯一の人であれば、あなたがここにどのように深く必要とするかはあなた次第です。しかし一般的には、200の範囲のものは成功したことを意味するので、ステータスコードが200であることを確認する必要があるかもしれません。そうでなければ、エラーがあると仮定できます。

HTMLからエラーメッセージを取得する方法については、これを行うには本当に良い方法ではありません。実際に行う必要はありません。より良い解決策は、すべてのHTMLを返さないようにAPIを変更することですが、代わりにより簡単に解析できる返答を返します。たとえば、APIがJSONを返す場合は、エラーが発生したときにエラーメッセージ、ステータスコード、および役に立つと思われるその他の情報を含むJSON応答を返すことができます。これを行うには、app/Exceptions/Handler.phpを変更して、エラー時にHTMLではなくJSON応答を返す必要があることが分かるようにする必要があります。

あなたがまたここに見つけることができる有用なエラー応答を、変更するためのドキュメントを見つけることがあります... https://laravel.com/docs/5.4/errors#the-exception-handler

具体的には、それはあなたがrender方法を変更する必要がありますように見えます。 JSONとして返す場合は、次のようにする必要があります。

/** 
* Render an exception into an HTTP response. 
* 
* @param \Illuminate\Http\Request $request 
* @param \Exception $exception 
* @return \Illuminate\Http\Response 
*/ 
public function render($request, Exception $exception) 
{ 
    return response()->json([ 
     'message' => $exception->getMessage(), 
     'code' => $exception->getCode(), 
    ]); 

    // return parent::render($request, $exception); 
} 

これは、エラーメッセージとステータスコードだけを返します。

+0

私はちょうどこれを試して、返されたstatusCodeを記録しました。何らかの理由で400ではなく0になっています。 – Rail24

+0

'curl_close'を使う前にそれは奇妙です。 – user3158900

+0

はい、それは 'curl_exec'の前でもありました。愚かな私。今それを400と比較する以外にエラーがあるかどうかを調べる一般的な方法はありますか? – Rail24

関連する問題