[Web API] 使用 HttpResponseMessage 與 HttpResponseException 的差異

摘要:[Web API] 使用 HttpResponseMessage 與 HttpResponseException 的差異

前言


  在 Web API 中提供了 HttpResponseMessage 與 HttpResponseException 用於處理返回訊息,HttpResponseMessage 用於返回一個來自於客戶端的請求結果訊息,你可以使用 HttpResponseMessage 自訂返回的內容,HttpResponseException 則是以當發生例外時用來返回客戶端錯誤訊息,例如一個 404 或 500 錯誤。

 

  其實用 HttpResponseMessage 也能夠返回 404、500 等錯誤,那為何還需要使用 HttpResponseException 來返回錯誤? 參考此文章 提出了一個觀點,文章中提到當呼叫 Web API 服務時發生了與預期上不同的錯誤時,理當應該中止程序返回錯誤訊息,這時對於錯誤的返回就該使用 HttpResponseException,而使用 HttpResponseMessage 則是代表著當客戶端發送了一個工作請求而 Web API 正確的完成了這個工作,就能夠使用 HttpResponseMessage 返回一個 201 的訊息,所以 HttpResponseMessage 與 HttpResponseException 在使用上根本的目標就是不同的,用 HttpResponseMessage 去返回一個例外錯誤也會讓程式結構難以辨別且不夠清晰,接著讓我們看一下 HttpResponseMessage 與 HttpResponseException 的操作方式。

 

HttpResponseMessage


  HttpResonseMessage 用來回應訊息並包含狀態碼及資料內容,如需要返回一個 HttpResonseMessage 的實例可以使用 Request 的擴充功能 CreateResponse 方法,如下

public HttpResponseMessage DeleteProductById(int id)
{
    // do something...
    return Request.CreateResponse(HttpStatusCode.OK);
}

 

  當然也可以自行定義回應的狀態碼及資料內容,如下

public HttpResponseMessage DeleteProductById(int id)
{
    // do something...
    var response = Request.CreateResponse(HttpStatusCode.OK);
    response.StatusCode = HttpStatusCode.OK;
    response.Content = new StringContent("Delete Success!");    // 回應內容
    return response;
}

 

  如果需要回應列舉物件可以使用 ObjectContent<T>,如下

public HttpResponseMessage GetAllProducts()
{
    HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
    response.Content = new ObjectContent<IEnumerable<product>>(
                                new ProductDao().GetProducts(), 
                                new JsonMediaTypeFormatter());
    return response;
}

 

  另外 CreateResponse 擴充方法也提供了 CreateResponse<T> 泛型的回應方法 ,如下

 public HttpResponseMessage GetProductById(int id)
 {
     IEnumerable<product> products = new ProductDao().GetProducts();
     var product = products.Where(p => p.Id == id);
     if (product.FirstOrDefault<product>() != null)
         return Request.CreateResponse<Product>(HttpStatusCode.OK, product.First<Product>());
     else
         throw new HttpResponseException(HttpStatusCode.NotFound);
 }

 

HttpResponseException


  HttpResponseException 為處理例外之用,能夠將指定的 HttpResponseMessage 返回至客戶端,在客戶端呼叫 Web API 發生錯誤時,客戶端並不會得到一個空值或錯誤畫面,故需要將錯誤包裝成回覆訊息而最基本的情況下可以只回覆狀態碼,如下。

public HttpResponseMessage GetAllProducts()
{
    throw new HttpResponseException(HttpStatusCode.NotFound);
}

 

  當然也能夠自己定義錯誤訊息內容,如下

public HttpResponseMessage PutProduct(int id, string name, string category, string price, int stock)
{
    ProductDao productDao = new ProductDao();
   
        if (productDao.UpdateProduct(id, name, category, price, stock))
            return Request.CreateResponse(HttpStatusCode.OK);
        else
        {
            var response = new HttpResponseMessage(HttpStatusCode.InternalServerError)
            {
                Content = new StringContent("Update Product Error"),
                ReasonPhrase = "Server Error"
            };
            throw new HttpResponseException(response);
        }
}

 

參考資料


HttpResponseMessage 類別

HttpResponseException 類別

HttpClient 類別

ASP.NET Web API

Two ways to work with HTTP responses in ApiController, HttpResponseMessage and HttpResponseException

Exception Handling in ASP.NET Web API

 

 


以上文章敘述如有錯誤及觀念不正確,請不吝嗇指教
如有侵權內容也請您與我反應~謝謝您 :)