2016-12-20 15 views
3

でエラーを処理するために、私は私が呼び出しプログラムにJSONレスポンスを送信する前にチェックをしていますいくつかの条件があります。私はこのようなものを使用してAPIテスト適切な方法は、私が働いていたWeb APIでのASP.NET Web API

return Content(HttpStatusCode.NotFound, "This user reached maximum API calls for today.", new JsonMediaTypeFormatter(), "application/json"); 

var result = new System.Net.WebClient().DownloadString("BadURL"); 

を私は期待されているunhandled Exception errorを取得私は、エラーを処理している

一つの方法は、このような何かを返すことです。この問題を回避するには

、私はこのような何かにロジックを扱う私の誤りでreturn文を変更します。

return Content(HttpStatusCode.OK, "This user reached maximum API calls for today.", new JsonMediaTypeFormatter(), "application/json"); 

そうであっても、ユーザは上記と同じWebClient()を使用して、彼らは有益なエラーメッセージを取得(このと他のエラーメッセージはよくなしException)のウェブサイトに記載されています。

が、これはASP.NETのWeb APIでエラーを処理する良い方法は何ですか?

+1

問題/エラーがある場合は、「OK」を返すかどうかはわかりませんが、私にはうまくいきます。以下は[HTTPステータスコード](http://www.iana.org/assignments/http-status-codes/http-status-codes.xml)のリストです。 –

答えて

1

私は、あなたはおそらく、あなたのAPIが標準のステータスコードの周りにモデル化するべきだと思います。 (エラーがあった場合は200を返さないでください)。ここで

は、REST APIのいくつかの一般的に使用されるステータスコードがhttp://www.restapitutorial.com/httpstatuscodes.html

あるあなたが見ている問題は、WebClientはステータスコード(例えば404)の多くの例外をスローするだけのことです。私はあなたのAPIがWebClientに例外を投げ込まないようにするべきだとは思わない。 WebClientをtry catchでラップしてWebExceptionを取得し、そこからステータスコードとエラーメッセージを取得できます。

(コードが、これに似たものをテストしていません)

try 
{ 
    var result = new System.Net.WebClient().DownloadString("BadURL"); 
    // process result 
} 
catch (WebException webEx) 
{ 
    var statusCode = ((HttpWebResponse)webEx.Response).StatusCode; 
    var body = new StreamReader(webEx.Response.GetResponseStream()).ReadToEnd(); 
    switch (statusCode) 
    { 
     case 404: 
      // parse error from your body (or in your case it is your body) 
     case ...: 
    } 
} 
1

おそらく、さまざまな状況のための適切なHTTPレスポンスになります。私が失敗した状態(API限界に達した)を得た場合、私は4xxエラーを受け取ることを期待します、それは要求を再試行しないように指示します。おそらく402または509です。あなたの認証が良好であることを意味するので、403が適切であると主張する人もいます。何らかの理由で許可にアクセスできない(たとえば、制限を超えて許可が取り除かれた)

言われて、あなたはあなたのAPIのセキュリティを考慮したいと思うこと

。多くのAPIは、2xx 400と500のみを返します。その理由は、必ずしもエラーに関する情報をあまりにも多く与える必要がないからです。 400は私の要求が悪いことを伝えています。私は試してはいけません。そして、500は私の問題ではなくサーバが何かに窒息していると私に伝えます。開発者がより多くの情報を提供する必要がある場合は、アプリケーションコードを含むカスタムメッセージ形式を使用し、コードを説明する開発者向けドキュメントがあることを確認してください。例えば

400 response with body 

{ 
    "code" : 8512, 
    "message" : "account status" 
} 

これはあなたの粒度や不分明のいくつかのレベルの両方を提供します。私のクライアントは、リクエストの試行をやめるべきであることをすぐに知ることができますが、コードが重要な場合は、それを使ってアクションを起こすことができます。

WebClientがスローして、それをキャッチし、コードをチェックし、適切なメッセージを作成することができます。しかし、もしあなたがそれを伝えたら、成功しなかっただけを投げるHttpClientを使うことをお勧めします。そしてそれはより標準的なクライアントです。

私が過去にしたことは、すべての応答規則を持つフォーマッタでサービス応答をラップすることです。たとえば、汎用フォーマッタのctor引数として使用するHttpResponseMessageを取得します。フォーマッタは、基本的にレスポンスの内容を公開するだけでなく、コードを翻訳し、両方を返信できる標準の応答形式に入れます。これは、私のAPIが別のWebサービスのプロキシとして動作している状況をカバーします。例外(またはその他のエラー)を変換する必要があるケースをカバーするために、Exception-Statusコードマッピングを持つマップ(フォーマッタに配置したマップ)を追加したばかりです。そんなことに興味があれば教えてください。私はそれを再現しようとします。

関連する問題