HTTPのエラーレスポンスの取得
WebAPIやスクレイピングを行った際に、UploadStringやHTTPWebRequestで取得やプッシュを行っている。
この際、失敗した場合の処理でHTTPヘッダのステータスコードなどを取得する例は多いが、レスポンスのコンテント部分を取得する例があまり見当たらないため、ここにメモしておく。
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication4 { class Program { static void Main(string[] args) { //要求するURL(わざとエラーにするため、アプリケーションIDの後ろにKKを挿入) string url = "http://shopping.yahooapis.jp/ShoppingWebService/V1/"; string_url += "itemSearch?appid=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxKK"; string_url += "&query=%E8%AE%83%E5%B2%90%E3%81%86%E3%81%A9%E3%82%93"; //WebRequestの作成 System.Net.HttpWebRequest webreq = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url); System.Net.HttpWebResponse webres = null; try { //サーバーからの応答を受信するためのWebResponseを取得 webres = (System.Net.HttpWebResponse)webreq.GetResponse(); //応答したURIを表示する Console.WriteLine(webres.ResponseUri); //応答ステータスコードを表示する Console.WriteLine("{0}:{1}", webres.StatusCode, webres.StatusDescription); } catch (System.Net.WebException ex) { //HTTPプロトコルエラーかどうか調べる if (ex.Status == System.Net.WebExceptionStatus.ProtocolError) { System.Text.Encoding enc = System.Text.Encoding.GetEncoding("shift_jis"); //HttpWebResponseを取得 System.Net.HttpWebResponse errres = (System.Net.HttpWebResponse)ex.Response; System.IO.Stream st = errres.GetResponseStream(); System.IO.StreamReader sr = new System.IO.StreamReader(st, enc); string return_str = sr.ReadToEnd(); //閉じる sr.Close(); //応答したURIを表示する Console.WriteLine(errres.ResponseUri); //応答ステータスコードを表示する Console.WriteLine("{0}:{1}", errres.StatusCode, errres.StatusDescription); } else Console.WriteLine(ex.Message); } finally { //閉じる if (webres != null) webres.Close(); } } } }
例外で取得できたWebExceptionのResponseをHTTPWebResponseに変換し、
(System.Net.HttpWebResponse)ex.Response
さらに、そのオブジェクトからStreamオブジェクトを取得するためGetResponseStream()
errres.GetResponseStream()
でStreamを取得。後はStreamReaderにて取得する。
そもそもStreamが取得できなかった場合の処理が未記入のため、そのあたりは改変してください。