iT邦幫忙

2025 iThome 鐵人賽

DAY 27
0
生成式 AI

三十天解鎖上下文超能力:MCP 實戰系列 第 27

Day 27 - 跨平台實戰 VIl - ADK api_server 不只能開在本機!

  • 分享至 

  • xImage
  •  

在過去一週,我們從零開始,成功地用 Swift 打造了一個精美的 iOS App,並與我們後端的 Python Agent 進行了完美的互動。然而,在看似順利的開發過程中,其實隱藏著一個每位開發者都可能遇到的「經典大魔王」—— 網路連線問題

今天,我們不介紹新功能,而是要扮演一回「偵探」。我將分享在這次 App 開發中,我遇到的最關鍵的一個錯誤 "Could not connect to the server.",並帶大家走一遍從發現問題、分析原因到最終解決的完整除錯流程。

這將是充滿實戰氣息的一天,讓我們開始吧!

一、問題的浮現:Could not connect to the server

在 Day 25,當我興奮地將 App 的 UI 和 NetworkManager 串連起來,準備進行第一次真實 API 呼叫時,按下「發送」按鈕後,Xcode 的控制台中無情地噴出了一長串紅色錯誤訊息,核心指向了同一個問題:Could not connect to the server (無法連線到伺服器)

這意味著我的 Swift App,根本找不到運行在電腦上的 Python adk api_server

二、初步調查:確認伺服器狀態

遇到連線問題,第一步永遠是檢查伺服器本身是否正常運行。我回到運行 adk api_server . 的終端機視窗,看到了以下日誌:

(venv) ➜ adk_mcp_Ithelp git:(main) ✗ adk api_server . 
... (省略警告訊息) ...
INFO:     Started server process [84450]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

截圖 2025-09-25 下午3.47.14

日誌清楚地顯示,伺服器正在運行,並且監聽著 http://127.0.0.1:8000
這就奇怪了,既然伺服器沒問題,為什麼我的 App 會連不上呢?

三、關鍵線索:127.0.0.1 的秘密

問題的關鍵,就藏在 127.0.0.1 這個 IP 位址中。

  • 127.0.0.1 又被稱為 localhost 或「本地回環位址 (Loopback Address)」。
  • 它是一個特殊的 IP 位址,永遠指向「本機自己」。

當我的 Python 伺服器綁定在 127.0.0.1 時,它意味著只有來自這台電腦內部的請求才能連接到它

而我的 Swift App 是運行在 iPhone 模擬器真實的 iPhone 上的。雖然它們和我的 Mac 在同一個 Wi-Fi 網路下,但對於作業系統來說,模擬器或 iPhone 是一個獨立的虛擬裝置,它們的請求是來自外部的,而不是來自 Mac「內部」。

這就是問題的癥結所在:伺服器把自己鎖在了「僅限內部訪問」的模式,自然就拒絕了來自 App 的連線請求!

四、尋找解決方案:求助於 help 指令

既然預設的啟動方式不行,那麼 adk api_server 指令本身有沒有提供修改綁定 IP 的方法呢?這時候,就是 --help 參數登場的最佳時機。

我在終端機輸入:

adk api_server --help

在眾多選項中,我發現了關鍵的參數:

Options:
  --host TEXT                   Optional. The binding host of the server  [default:
                                  127.0.0.1]

--host TEXT 這個選項,允許我們指定伺服器綁定的主機 IP,而它的預設值,正是 127.0.0.1

截圖 2025-09-25 下午3.47.56

五、最終解決:綁定到 0.0.0.0

要讓伺服器能被區域網路內的其他裝置(比如我們的 iPhone)訪問,我們需要將它綁定到一個特殊的 IP 位址:0.0.0.0

  • 0.0.0.0 代表「本機上的所有網路介面 (All Interfaces)」。

當伺服器綁定到 0.0.0.0 時,它不僅會監聽 127.0.0.1,還會監聽你電腦的有線網路 IP、Wi-Fi IP 等所有可用的 IP 位址。這就等於是把家裡的門打開,歡迎來自同一個 Wi-Fi 下的朋友來作客。

我停止舊的伺服器 (Ctrl + C),並使用新的指令重新啟動:

adk api_server . --host 0.0.0.0

接著,將 Swift App 中 NetworkConfiguration.swifthost,從 "http://localhost:8000" 修改為 "http://<你的電腦區域網路IP>:8000"

再次運行 App,按下發送——成功!錯誤消失了,Xcode 控制台成功印出了來自後端 Agent 的回應。

最終結果

前端介面:
可以看到我們可以成功查詢並且運用 wazuh mcp server了!
截圖 2025-09-25 16.08.18

後端:
可以看到成功被呼叫,狀態碼為200
截圖 2025-09-25 下午4.10.19

前端 github repo 有興趣的可以 clone 來玩看看唷,裡面還是有許多的 bug
QWQ
https://github.com/Yulin494/ItHelpHomeIOSApp

六、今日總結

今天,我們共同偵破了一起經典的網路連線懸案。這個過程雖然曲折,但收穫滿滿:

  1. 深刻理解了 127.0.0.1 (localhost) 與 0.0.0.0 的區別和用途。
  2. 學會了使用 --help 參數來探索 CLI 工具的隱藏功能。
  3. 掌握了在開發行動 App 與本地後端聯調時,正確設定伺服器綁定 IP 的關鍵技巧。

除錯是開發日常的一部分,每一次成功解決問題,都會讓我們對技術的理解更上一層樓。

我們的 App 現在已經功能完備且連線穩定。明天,我們將對這趟漫長而精彩的 30 天旅程進行一次全面的回顧,梳理我們從 MCP 理論到 n8n,再到 Python 與 Swift App 的所有知識點!


上一篇
Day 26 - 跨平台實戰 VI:處理回應與動態更新 UI,完成互動閉環
下一篇
Day 28 - 回顧篇:30 天的 MCP 旅程,我們學到了什麼?
系列文
三十天解鎖上下文超能力:MCP 實戰28
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言