日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

當一個 API 請求沒能成功的時候,客戶端最好能收到一個正確的 HTTP 錯誤狀態,例如 409 或 500,這會是一個好的開始。不幸的是,盡管 400 Bad Request 可能就足夠讓我們知道錯誤出在哪里,但常見的情況是我們沒有充足的信息來理解或解決實際遇到的問題。

許多 API 會在響應正文中為你提供更多細節,但令人遺憾的是,每個 API 都有自己的定制風格,不同的 API,甚至在各個端點使用的報告樣式都不一樣。這就需要定制的邏輯或者人工干預才能理解報告的內容。

但這種情況并非無可避免。先不用急著否定我。試著想象一個更好的世界,其中每個 API 都以相同的標準格式返回錯誤信息。

我們可以用一致的標識符來識別各種類型的錯誤,并能在任何地方輕松獲得清晰的描述和元數據。你的通用 HTTP 客戶端可以自動為任何錯誤提供詳盡細節,你的客戶端錯誤處理機制則能輕松可靠地過濾出你所關心的特定錯誤,并且你能使用單組共享邏輯來處理多種 API 的常見錯誤。

IETF 提出的 RFC 7807 標準希望定義一個 HTTP API 錯誤響應的標準格式,從而實現上述目標。它已經開始在現實世界中得到應用了。人們可以很容易地用它來支持現有的 API 和客戶端,對于構建或使用 HTTP API 的人來說,這個標準值得關注。

標準錯誤格式為什么這么有用?

API 請求失敗后發生了什么?

請不要這樣做

談這個問題前,讓我們先退一步思考問題。HTTP 的一個關鍵特性是標準的響應狀態代碼,例如 200 或 404。正確使用這些代碼可確保客戶端自動理解響應的總體狀態,并根據對應狀態采取適當措施。

狀態代碼對錯誤處理來說特別有用。當請求收到意外的 500 狀態時,幾乎所有標準的 HTTP 客戶端都會自動為你拋出一個錯誤,并不需要自定義規則來解析和解釋各處的所有響應,從而確保意外錯誤能被可靠地報告,并可以在任何位置輕松處理。

這是很好的機制,但它也有很大的局限性。

實際上,一個 HTTP 400 響應可能表示以下任何一種情況:

  • 你的請求格式錯誤,無法解析
  • 你的請求意外為空,或缺少一些必需的參數
  • 你的請求有效,但仍然模棱兩可,因此無法處理
  • 你的請求有效,但由于服務器錯誤,服務器認為請求無效
  • 你的請求有效,但請求的是完全不可能的內容
  • 你的請求已啟動,但服務器拒絕了你提供的參數值
  • 你的請求已啟動,但服務器拒絕了你提供的每個參數值
  • 你的請求已啟動,但你的銀行拒絕了其中包含的銀行卡資料
  • 你的請求完成了一項購買操作,但請求的其他部分在稍后階段被拒絕

這些全是錯誤,看起來都是由一個“壞”請求觸發的 400 錯誤,但它們的內容卻大相徑庭。

狀態代碼可幫助我們區分錯誤和成功狀態,但沒法區分得太細致。因此,HTTP 客戶端庫不能在拋出的錯誤中包含任何有用的細節,每個 API 客戶端都必須編寫自定義的處理機制來解析每個失敗的響應,并自行找出可能的原因和下一步應該做的操作。

如果失敗的 HTTP 請求自動拋出的異常消息不僅僅是HTTP Error: 400 Bad Request,而是 Credit card number is not valid,這樣豈不更好?

只要錯誤有一套標準格式,上面提到的每個錯誤就都可以有自己的唯一標識符,并包含標準化的說明內容和指向更多細節的鏈接。好處是:

  • 通用工具可以為你解析和解釋錯誤的詳細信息,而無需事先了解任何與 API 相關的信息。
  • API 能更安全地發起錯誤響應,因為它知道這些錯誤類型標識符意味著即使解釋消息發生了更改,客戶端也會一直按同一種理解方式識別錯誤。
  • 自定義 API 客戶端可以檢查錯誤類型以輕松處理特定情況,所有操作都以一種標準方式進行,適用于你所使用的每個 API,而無需從頭開始編寫 API 包裝程序,也用不著每次都和 API 文檔大戰三百回合。

提案的錯誤格式長什么樣?

為此,RFC7807 提出了一組用于返回錯誤的標準字段,以及兩種將其格式化為 JSON 或 XML 的內容類型。

格式如下:

{
    "type": "https://example.com/probs/out-of-credit",
    "title": "You do not have enough credit.",
    "detail": "Your current balance is 30, but that costs 50.",
    "instance": "/account/12345/transactions/abc"
}

對于 XML 的等效格式:

<?xml version="1.0" encoding="UTF-8"?>
<problem xmlns="urn:ietf:rfc:7807">
    <type>https://example.com/probs/out-of-credit</type>
    <title>You do not have enough credit.</title>
    <detail>Your current balance is 30, but that costs 50.</detail>
    <instance>/account/12345/transactions/abc</instance>
</problem>

這些 RFC 為此定義了兩種新的對應內容類型:Application/problem+json或application/problem+xml。返回錯誤的 HTTP 響應應在其Content-Type響應標頭中包含適當的內容類型,并且客戶端可以檢查該標頭以確認格式。

這個示例包括規范定義的一些標準化字段。完整列表是如下:

  • type:標識錯誤類型的 URI。在瀏覽器中加載這個 URI 應該轉向這個錯誤的文檔,但這不是嚴格要求的。此字段可用于識別錯誤類。理論上講,將來站點甚至可以為常見情況共享標準化的錯誤 URI,以使通用客戶端自動檢測到它們。
  • title:錯誤的簡短可讀摘要。這是明確的指引,客戶端必須使用 type 作為識別 API 錯誤類型的主要方式。
  • detail:較長的人類可讀解釋,帶有完整的錯誤詳細信息。
  • status:錯誤使用的 HTTP 狀態代碼。它必須與實際狀態匹配,但可以包含在這里的 body 中以便參考。
  • instance:標識該特定故障實例的 URI。它可以作為發生的這個錯誤的 ID,和/或到特定故障更多詳細信息的鏈接,例如顯示失敗的信用卡交易細節的頁面。

所有這些字段都是可選的(不過type是強烈建議使用的)。內容類型允許自由包含其他數據,只要它們不與這些字段沖突即可,因此你也可以在此處添加自己的錯誤元數據,并包含所需的其他任何數據。實例 URI 和類型 URI 都可以是絕對 URI,也可以是相對 URI。

這里的思想是:

  • 通過返回帶有合適Content-Type標頭的錯誤響應,API 能很容易地表明它們正在遵循這一標準。
  • 這是一組簡單的字段,可以輕松添加到大多數現有的錯誤響應頂部(如果還沒有添加的話)。
  • 客戶端只需在請求中包含Accept: application/problem+json(和/或+xml)標頭,即可輕松表明支持狀態,從而在必要時進行遷移。
  • 客戶端邏輯可以輕松識別這些響應,并使用它們來顯著改善通用和按 API 區分的 HTTP 錯誤處理操作。

怎樣開始使用它呢?

目前,這是一個提案的標準,因此它尚未普及,并且在理論上可能會發生變化。

不過它已經用在很多地方,包括 5G 標準之類中,并且有了適用于大多數語言和框架的一些便捷工具,包括:

  • ASP.NET的內置支持
  • Node.js 的通用庫和Express庫
  • JAVA 的通用庫和Spring Web MVC庫
  • Python 的通用庫和Django REST API庫
  • Ruby 的通用、Rails和Sinatra庫
  • php 的通用庫和Symfony庫
  • Rust、Go、Scala、Haskell的庫...

也就是說,它已經滲透到了大多數主流生態系統中站穩了腳跟,并且即將更進一步:讓更多 API 和客戶端開始使用,直到實現大規模的普及狀態,即大多數 API 的錯誤格式都遵循其標準,使它成為所有場景的默認值,讓我們大家都能從中受益。

我們該如何做到這一點呢?

如果你在構建或維護一個 API:

  • 如果可以的話,請嘗試使用適當的Content-Type響應標頭以RFC 7807格式返回錯誤。
  • 如果你有了一種錯誤格式,并且需要維護該格式以保證兼容性,請檢查是否可以在格式頂部添加這些字段,并對其進行擴展以符合標準。
  • 如果不能,請嘗試檢測傳入的Accept標頭中的支持,并在可能的情況下使用它來將原有的錯誤格式切換為標準格式。
  • 使用你的 API?框架(比如這個框架)記錄錯誤,表明它們將來會轉向標準錯誤格式。

如果你在使用一個 API:

  • 檢查這些內容類型的錯誤響應,并用那里提供的數據改進你的錯誤報告和處理工作。
  • 考慮在請求中包含帶有這些內容類型的Accept標頭,以表明支持狀態并在可用時啟用標準錯誤。
  • 向你使用的 API 提出抱怨,希望它們以這種標準格式返回錯誤,就像抱怨那些不會費心返回正確狀態代碼的 API 一樣。

至于大家:

  • 參與其中!這是 IETF 新的“HTTP API 的構建塊”工作組旗下的規范。你可以加入郵件列表以閱讀并參與有關該規范和其他可行 API 標準規范規范的討論,包括速率限制和API棄用等。
  • 向你的同事和開發者朋友做宣傳,并幫助大家簡化錯誤處理的工作。

原文鏈接:

https://httptoolkit.tech/blog/http-api-problem-details/

分享到:
標簽:API
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定