為什么調用API總返回404,該如何調試

當調用一個應用程序接口(API)時,持續地收到“404 未找到”的錯誤,其核心原因在于客戶端發起的“請求”,未能成功地,匹配到服務器上任何一個“真實存在”的、可供訪問的“資源路徑”。這本質上,是一個“尋址失敗”的問題。導致這種“尋址失敗”的“罪魁禍首”,通常涵蓋了五個層面:請求的“統一資源定位符”路徑錯誤、請求的“HTTP方法”不匹配、服務端“路由”配置缺失或錯誤、資源本身因“業務邏輯”而確實不存在、以及網絡中的“代理”或“防火墻”攔截

其中,請求的“統一資源定位符”路徑錯誤,是最為普遍、也最容易被忽略的直接原因。一個多余的斜杠、一個微小的拼寫錯誤、或是開發環境與生產環境的基礎路徑差異,都足以讓一個看似“完美”的請求,變成一次“寄往不存在地址的信件”。服務器,作為一個嚴謹的“郵局”,在無法找到這個“地址”時,便會忠實地,返回一個404狀態碼,以告知客戶端:“你所請求的資源,在此處,并不存在。”

一、錯誤的“本質”、理解404 Not Found的“官方”含義

在開始進行“排查”這一技術性動作之前,我們必須首先,在“認知”層面,對404這個狀態碼,建立一個精準的、無歧義的理解。錯誤地理解一個問題的“定義”,常常會導致我們,在錯誤的“方向”上,浪費大量的調試時間

1. 404不是“服務器崩潰”

首先,必須明確,404是一個客戶端錯誤碼(屬于4xx系列)。它所傳遞的核心信息是:“服務器,已經成功地,接收并理解了你的請求,但是,在服務器上,找不到你所請求的那個特定的資源。” 這與5xx系列的服務器錯誤(例如,500內部服務器錯誤,或503服務不可用),有著本質的區別。收到404,意味著,服務器本身,是“健康”且“在線”的。問題,出在了我們客戶端,所發起的“請求”本身。

2. 404不是“無權限”

其次,404也不同于401 未授權403 禁止訪問

401意味著:“你需要先‘登錄’,我才能告訴你,這里有沒有東西。”

403意味著:“我知道這里有東西,但根據你的‘身份’,我明確地‘禁止’你訪問它。”

404則意味著:“我(服務器)已經確認了你的身份,并幫你找過了,但你所請求的那個‘地址’,在我的管轄范圍內,真的,就是‘空’的。”

3. 一個關于“郵局”的說明

我們可以用一個簡單的生活化說明,來理解這個差異。

  • 5xx錯誤:相當于,郵局,因為內部裝修或罷工,而“關門大吉”了。
  • 401/403錯誤:相當于,郵局正常營業,但這封信,因為是“機密”文件,你沒有出示相應的“證件”,而被門衛“攔下”了。
  • 404錯誤:則相當于,郵局正常營業,門衛也確認了你的身份,但你信封上寫的那個“幸福大街888號”,在整個城市的地圖上,都查無此地

因此,所有關于404錯誤的調試,其核心,都應圍繞著“尋址”這條主線展開

二、排查路徑一、檢查“地址” - 統一資源定位符

這是排查404問題的第一步,也是最容易發現問題的一步。統一資源定位符(通常指網址),就是我們寄往服務器那封“信”的“地址”。

1. 基礎路徑與域名

首先,檢查構成地址的“主干”部分。

協議是否正確? http:// 還是 https://?在一個強制要求安全連接的服務器上,使用非加密的協議,可能會被重定向或拒絕。

域名或IP地址是否正確? 是否存在拼寫錯誤?你是否,錯誤地,將一個請求,發往了“測試”環境的域名,而非“生產”環境的域名?(例如,api.test.example.com vs api.example.com

端口號是否正確? 如果接口服務,運行在一個非標準的端口上(例如,8080),你是否,在地址中,正確地包含了它?

基礎路徑是否正確? 許多接口,都有一個統一的“基礎路徑”(例如,/api/v2/)。這個基礎路徑,是否存在拼寫錯誤,或者,版本號是否正確?

2. 資源路徑與拼寫

這是最低級,但也最常見的錯誤。人腦,在閱讀時,會自動地,糾正微小的拼寫錯誤,但計算機,不會。

/users/123 對比 /user/123 (多了一個s)

/product/details 對比 /product/detials (元音字母ai的顛倒)

/order-summary 對比 /order_summary (連接符 - 與下劃線 _ 的混淆) 在排查時,最可靠的方法,不是用“肉眼”去看,而是直接地,從接口文檔中,“完整地、精確地,復制”出路徑字符串,并與你代碼中的,進行一次“文本對比”

3. 路徑參數的格式

在現代的**RESTful API**設計中,我們常常,將資源的唯一標識,作為路徑的一部分。

場景:服務器端的路由,被定義為 /users/{id},并且,為了健壯性,對id這個“路徑參數”,做出了“必須是數字”的類型約束。

問題:客戶端,因為某種原因,傳遞了一個“非數字”的標識,例如 /users/abc

后果:這個請求,雖然在“形狀”上,看起來,與路由匹配,但因為它,不滿足“參數必須是數字”的這個“前置約束”,所以,路由系統,會直接判定為“不匹配”,并返回404

三、排查路徑二、檢查“開門方式” - 請求方法

如果,我們100%地,確認了“地址”是正確的,那么,第二個需要排查的,就是我們去訪問這個地址的“方式”——即請求方法

1. 資源與方法的“契約”

在現代的、規范的接口設計中,“資源”(由地址表示)與“方法”(如GET, POST, PUT, DELETE等),存在著一種強綁定的“契約”關系。同一個地址,對于不同的請求方法,其所代表的“操作”,是完全不同的。

GET /users:通常,代表“獲取”一個用戶列表。

POST /users:通常,代表“創建一個”新的用戶。

2. 最常見的混淆:GETPOST

場景:開發者,需要,實現一個“創建新用戶”的功能。他正確地,將請求,發送到了/users這個地址。但是,他所使用的請求方法,卻是瀏覽器默認的GET方法。

問題分析:然而,在服務器端,工程師,只為/users這個地址,配置了用于處理“創建”邏輯的POST方法路由。服務器的路由表里,根本不存在一個GET /users的路由規則。

后果:當這個GET請求,到達服務器時,路由系統,在自己的“地圖”上,找不到任何一個,能夠同時匹配“/users地址”和“GET方法”的“目的地”。因此,它只能,向客戶端,返回一個404

四、排查路徑三、審視“服務器” - 路由與邏輯

如果,“地址”和“方式”,都已確認無誤,那么,我們就需要,將排查的目光,從“客戶端”,轉向“服務器端”。

1. 路由“未定義”或“配置錯誤”

這是最直接的服務器端原因。客戶端,在請求一個,后端開發者,“忘記”了去創建或配置的路由。或者,在路由的配置中,存在微小的拼寫錯誤。這種情況,在前后端分離的、并行的開發模式中,尤為常見。

2. 中間件的“攔截”

在現代的Web框架中,“中間件”是一個非常普遍的概念。它如同,在請求到達“最終的目的地”(即業務邏輯處理器)之前,所必須經過的一系列“安檢站”。

場景:一個接口,可能,需要經過“身份認證中間件”、“權限校驗中間件”、“請求體解析中間件”等。

問題:如果,其中某個中間件,出現了配置錯誤,或者,我們的請求,未能滿足某個中間件的“前置要求”(例如,缺少了一個必要的請求頭),那么,這個中間件,就可能,會提前地,中斷整個請求的處理流程,并直接,向客戶端,返回一個錯誤。在某些配置下,這個錯誤,就可能是404

3. 業務邏輯導致的“假性”404

這是一個極其重要,也極具迷惑性的情況

場景:客戶端,請求 /users/999,試圖獲取ID為999的用戶信息。

服務器端行為

服務器的路由系統,成功地,匹配到了/users/{id}這個路由規則。

請求,被成功地,傳遞給了,處理這個路由的業務邏輯函數

在這個函數內部,程序,去數據庫中,查詢id = 999的用戶。

查詢結果為“”,即,數據庫中,不存在這個用戶。

此時,后端的開發者,主動地、有意識地,在其業務代碼中,決定,向客戶端,返回一個404狀態碼

分析:在這種情況下,404,并非一個“路由”層面的錯誤,而是一個“業務邏輯”層面的、被有意返回的結果。它所傳遞的語義,是“你所請求的這個‘資源實例’,在我們的業務數據中,不存在”,這,恰恰是404狀態碼,最精準的、語義化的應用之一。

五、系統性的“調試”與“預防”

1. 調試工具箱

瀏覽器開發者工具“網絡”面板,是所有Web API調試的“第一站”。它能夠,像一個“行車記錄儀”一樣,完整地,記錄下,每一次請求的所有細節:完整的請求地址、請求方法、請求頭、請求體、以及服務器返回的完整響應

接口測試工具:像PostmancURL這樣的工具,允許你,脫離自己復雜的前端代碼,去獨立地、干凈地,對一個接口,進行調用。這能夠幫助你,快速地,隔離和定位,問題,到底是出在“你自己的調用代碼”,還是“接口本身”。

服務器端日志:這是“最終的真相”。通過查看服務器的“訪問日志”和“應用錯誤日志”,我們可以確定無疑地知道:我們的請求,到底,有沒有“到達”服務器?如果到達了,服務器,又是如何處理它,并在哪個環節,最終決定,返回404的?

2. 預防策略

使用接口定義語言:像**OpenAPI (Swagger)**這樣的工具,允許我們,用一種“機器可讀”的、標準化的格式,來定義接口的“合同”。基于這份“合同”,我們可以,自動地,生成客戶端的調用代碼、服務器端的路由框架、以及接口的交互式文檔。這種“代碼生成”的方式,能夠從根本上,杜絕因“手動”編寫,而導致的各種拼寫和類型錯誤。

建立清晰的文檔與規范:接口的文檔,必須被視為與代碼同等重要的“交付物”。

端到端的集成測試:建立自動化的“集成測試”,來模擬真實的前后端交互。這些測試,能夠在每次代碼變更后,自動地,檢查出,是否引入了任何導致404的路由或契約破壞。

常見問答 (FAQ)

Q1: 404(未找到)和 403(禁止訪問)有什么區別?

A1: 404表示,服務器,找不到你所請求的資源地址,它強調的是“不存在”。而403則表示,服務器,找到了你請求的資源,但根據你的身份和權限,你“被禁止”訪問它。前者,是“地址錯了”;后者,是“有地址,但沒鑰匙”。

Q2: 為什么有時候我刷新一下頁面,404錯誤就消失了?

A2: 這通常,暗示著,問題,可能與“時序”或“緩存”有關。例如,你可能,在請求一個剛剛被創建的資源,但因為數據庫主從同步的延遲,導致在第一次請求時,資源尚未被同步到你所查詢的那臺“從庫”上。或者,是某個網絡層的緩存,返回了一個過時的、“不存在”的響應。

Q3: 我確定我的地址和請求方法都正確,但服務器就是返回404,可能是什么原因?

A3: 此時,應重點排查“服務器端”的原因。首先,與后端開發者確認,該路由,是否真的,已被正確地,部署到了你正在請求的那個環境中?其次,檢查,是否有中間件(如認證、權限)提前攔截了你的請求。最后,確認,這是否是一個由業務邏輯(即,你請求的那個具體的數據,在數據庫中不存在),所“有意返回”的404

Q4: 作為應用程序接口的設計者,我應該在什么情況下,主動返回404錯誤?

A4: 當客戶端,請求一個“具體的資源實例”(例如,/users/一個不存在的用戶ID,或/orders/一個不存在的訂單號),而這個實例,在你的業務數據中,確實不存在時,主動地,返回一個404,是一種非常標準、清晰、且符合語義的最佳實踐。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/96284.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/96284.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/96284.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

醫療信息化自主可控轉型的實踐探索 —— 以常德二院為例

目錄 頭雁領航 - 激發醫療新質生產力 核心支撐 - 電科金倉奠定數據底座 生態共建 - 攜手護航醫療信創發展 信創產業發展是國家經濟數字化轉型、提升產業鏈發展的關鍵,是科技自立自強的核心基座,其本質是實現中國信息化產業的自主可控。醫療信創作為關…

Gin傳參和接收參數的方式

Gin查詢參數和接收參數的方式 常用 Gin 綁定方法對比方法用途特點c.Bind()自動識別 Content-Type最通用,根據請求頭自動選擇綁定方式c.ShouldBindJSON()只綁定 JSON強制使用 JSON 格式,類型明確c.ShouldBindXML()只綁定 XML強制使用 XML 格式c.ShouldBin…

MariaDB/MySQL 客戶端工具與服務端配置精要指南

文章目錄一、客戶端與服務端程序二、用戶賬號管理三、MySQL 客戶端命令3.1 命令類型?3.2 使用模式?3.3 常用選項?3.4 提示符定制?四、mysqladmin管理命令??五、服務端配置?5.1 配置文件???5.2 Socket 通信配置??六、最佳實踐總結免費個人運維知識庫,歡迎…

自動化項目日報生成工具測評與選型:如何匹配團隊日報管理需求

引言在項目管理場景中,手動撰寫日報常面臨多重效率瓶頸:任務數據分散在協作群、Excel 表格、項目看板等多個平臺,匯總時需反復核對;不同成員日報格式不統一,管理層整合分析耗時;任務進度與日報信息不同步&a…

基于SpringBoot+Vue的吳韻蘇香文旅小程序(協同過濾算法、Echarts圖形化分析、騰訊地圖API、二維碼識別)

🎈系統亮點:協同過濾算法、Echarts圖形化分析、騰訊地圖API、二維碼識別;一.系統開發工具與環境搭建1.系統設計開發工具后端使用Java編程語言的Spring boot框架 項目架構:B/S架構 運行環境:win10/win11、jdk17小程序&a…

python numpy.random的基礎教程(附opencv 圖片轉數組、數組轉圖片)

目錄 1.在區間[a,b)隨機生成n個整數。 2.在區間[a,b)隨機生成n個數。 3.在區間[0,1)生成隨機數 4.打亂順序 5.從指定的列表中選擇 NumPy(Numerical Python)是一個開源的科學計算庫,專門用于高效處理多維數組(ndarray&#xf…

Vue2.x核心技術與實戰(二)

目錄 三、Vue2.x:生命周期+工程化開發(組件入門) 3.1 生命周期 3.1.1 生命周期 & 生命周期四個階段 3.1.2 生命周期鉤子 Vue生命周期鉤子案例 - 新聞列表 & 輸入框自動聚焦 3.2 綜合案例:小黑記賬清單 3.3 工程化開發入門 3.3.1 工程化開發 & 腳手架Vue …

【鴻蒙心跡】7×24小時極限求生:當Origin_null遇上鴻蒙,我如何用100杯咖啡換一條跨域活路?

文章概要 大家好,我是那個把黑眼圈熬成華為工牌掛繩的倒霉蛋。過去100個夜晚,我在HarmonyOS NEXT的ArkWeb里被Origin:null反復按在地上摩擦——小程序白屏、OPTIONS 400、官方文檔沉默三連擊。最終,我用C、libcurl、OpenSSL和一堆速溶咖啡&am…

【git】刪除一條本地提交的歷史commit

在工程中,如果想要刪除一條本地提交的歷史commit,可以通過droprebase -i HEAD^n的方式。1.情景提交了三條commit,想刪掉第二條commit。git logcommit_id_*******1 commit_id_*******2 commit_id_*******32.解決git rebase -i HEAD~2輸出&…

軟件測試中,JMeter 的作用以及優缺點是什么?

回答重點JMeter 是一款開源的軟件測試工具,主要用來對各種軟件或服務進行性能測試和負載測試。它可以模擬大量用戶同時對服務器、網絡或其他資源發起請求,從而測試它們的響應時間、吞吐量等性能指標。優點:1) 開源且免費 &#xf…

STM32存儲結構

我們在使用Keil編譯程序成功后會,有一行各部分占用內存的提示信息,如下Program Size:Code7492 RO-data556 Rw-data72 ZI-data11688,這是stm32代碼編譯后的提示我們分析一下這個編譯輸出:- Code: 7492字節 -> 代碼部分(存放在Flash)- RO-da…

手機 瀏覽器調用攝像頭掃描二維碼Quagga

注&#xff1a;需用谷歌瀏覽器才能調用權限1. 引入依賴&#xff1a;npm install ericblade/quagga2<template><el-button color"#188ae2" click"handleScan" class"scan-btn" :disabled"isInitializing || isScanning">{{…

【Oracle篇】偽列之Version Query:全鏈路追蹤行數據變更的所有記錄(不僅僅是被修改的最后時間)(第二篇,總共六篇)

&#x1f4ab;《博主主頁》&#xff1a;    &#x1f50e; CSDN主頁__奈斯DB    &#x1f50e; IF Club社區主頁__奈斯、 &#x1f525;《擅長領域》&#xff1a;擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控&#xff1b;并對…

代理模式深度解析:從靜態代理到 Spring AOP 實現

代理模式是軟件開發中一種經典的設計模式&#xff0c;它通過引入 "代理對象" 間接訪問目標對象&#xff0c;從而在不修改目標對象代碼的前提下&#xff0c;實現功能增強&#xff08;如日志記錄、事務管理&#xff09;、權限控制等橫切需求。從簡單的靜態代理到靈活的…

算法 ----- 鏈式

目錄 一 、鏈式 二 、題目 1、兩兩相加 &#xff08;1&#xff09;題目 (3) 代碼書寫 2、兩兩交換鏈表中的節點 &#xff08;1&#xff09;題目 &#xff08;2&#xff09; 解題思路 &#xff08;3&#xff09;代碼書寫 3、重排鏈表 &#xff08;1&#xff09;題目 …

運維監控prometheus+grafana

目錄 一、環境 二、Node_exporter部署 三、Prometheus部署 四、Grafana部署 五、驗證、使用 一、環境 系統使用CentOS7虛擬機。 監控三臺服務器&#xff1a; 192.168.114.10 Node1 #部署Prometheus、node_exporter、Grafana 192.168.114.20 Node2 …

數字孿生 :提高制造生產力的智能方法

近年來&#xff0c;在先進數字技術深度整合的推動下&#xff0c;制造業經歷了深刻變革。數字孿生技術作為其中最具前景的創新之一&#xff0c;正重塑工廠和生產流程的設計、監控和優化方式。該技術的核心在于為物理資產、系統或流程創建虛擬映射。這種虛擬映射實時同步現實世界…

【論文閱讀】-《SIGN-OPT: A QUERY-EFFICIENT HARD-LABEL ADVERSARIAL ATTACK》

Sign-OPT: 一種查詢高效的硬標簽對抗攻擊 原文鏈接&#xff1a;https://arxiv.org/pdf/1909.10773 摘要 我們研究在訪問受限情況下評估機器學習系統對抗魯棒性的最實用問題設置&#xff1a;用于生成對抗樣本的硬標簽黑盒攻擊設置&#xff0c;其中允許有限的模型查詢&#xff…

安卓11 12系統修改定制化_____如何去掉 搜狗輸入法 首次運行時權限授權彈窗 其他應用可借鑒

有些內置應用或者第三方應用在首次使用時會跳出權限允許彈窗。雖然這個是系統為了用戶安全設置的一道檢測機制。但無形之中會影響到定制類用戶的使用。那么能不能去除這個首次運行的權限彈窗呢。其實也有多方法可參閱解決。 通過博文了解?????? 1??????-----首次…

雙環模型:一個蘊含安全哲學的類設計解析

雙環模型&#xff1a;一個蘊含安全哲學的類設計解析 在編程世界中&#xff0c;優秀的類設計不僅能實現功能需求&#xff0c;更能體現開發者對系統本質的理解。本文將深入剖析一個看似簡單卻蘊含深刻安全哲學的OP類&#xff0c;探討其雙環模型背后的設計思想與實踐價值。 類結構…