2011-04-28

使用HttpWebRequest時取得網站回應的錯誤內容

當我們使用HttpWebRequest物件,對某個網站發出Request的時候,在沒有錯誤的情況下(通常http status code是200),我們很容易取得網站回應的內容,簡單的幾行就行了:
HttpWebRequest request = 
  (HttpWebRequest)HttpWebRequest.Create("http://YOUR_URL/");

HttpWebResponse response = 
  (HttpWebResponse)request.GetResponse();
Stream stream = 
  response.GetResponseStream();
StreamReader sr = 
  new StreamReader(stream);
string result = sr.ReadToEnd();


但如果我們因為參數或網址錯誤,導致網站回應錯誤,就會取得如 400 Bad Request、404 Not Found...等等的這種http status,在瀏覽器上就會看到像這樣的畫面:

這種情況下,會在執行HttpWebRequest.GetResponse()的時候,引發WebException,原本以為就此拿不到WebResponse物件,也就不能取得網站的回應內容(Content);後來發現被藏在WebException.Response裡,這下Status Code、網站回應內容就都到手啦:

HttpWebRequest request = 
  (HttpWebRequest)HttpWebRequest.Create("http://YOUR_URL/");
HttpWebResponse response = null;

try
  {
    //執行Request
    //若網站回應錯誤,就會在此引發WebException
    response = (HttpWebResponse)request.GetResponse();
  }
  catch (WebException e)
  {
    //網站回應錯誤,
    response = (HttpWebResponse)e.Response;
  }


  if (response != null)
  {
  Stream stream = response.GetResponseStream();
  StreamReader sr = new StreamReader(stream);
  string result = sr.ReadToEnd();
  switch (response.StatusCode)
  {
      case HttpStatusCode.OK:
          //200:正常
          //(略)
          break;
      case HttpStatusCode.BadRequest:
          //400:錯誤
          //(略)
          break;
      default:
          //其他狀態
          //(略)
          break;
  }
  response.Close();
  }



在使用Plurk API的時候,是透過http的狀態去判斷呼叫成功與否,200 OK代表正確,400 Bad Request就表示有錯,兩者都會用JSON字串回傳相關資訊,我們如法泡製,就可以開始用API進行開發工作了:


MSDN Reference:

其他參考資料:

2 則留言:

  1. 匿名6/13/2017

    您說 : 這種情況下,會在執行HttpWebResponse.GetResponse()的時候...
    應該是HttpWebRequest.GetResponse()

    回覆刪除
    回覆
    1. 的確誤植了,感謝指正。

      刪除

引用 Topshelf 無法進行偵錯的經驗

Topshelf  是一個可以簡化撰寫 Windows Service 的套件,引用之後,我們只要當作撰寫一般 Console 的應用程式就可以。 只是近來撰寫上遇到無法進行Debug的狀況,在Visual Studio一進行偵錯可以看到Console 程式被執行,並顯示...