Skip to main content

症狀

批次呼叫的指令碼(常見於 Windows + Python requests)間歇性收到 502,打印出來的響應大致是這樣:
同時有這幾個特徵:
  • 響應正文為空,響應頭只有 ConnectionContent-Length 兩個欄位
  • 網頁版控制台一直正常,沒有跟著打不開
  • 呼叫日誌 裡查,這些失敗請求一條記錄都沒有
  • 指令碼按 502 重試,往往要連續失敗好幾次才成功,退避時間越拉越長

簡短回答

這種 502 不是 API易 返回的,而是你電腦上的代理軟體(Clash、v2rayN 等)自己生成的。讓指令碼繞開系統代理就能解決:requests 裡設定 session.trust_env = False,其他語言的做法見下文。

怎麼判斷是不是這種情況

API易 各層返回的響應都有固定特徵,和上面的空 502 對不上: 所以只要看到沒有 Server、沒有 Date、正文為空的 502,基本就能斷定它來自代理軟體,而不是 API易。
平臺側確實也會出現 502,那種是服務容器短暫重啟,網頁版會同時打不開,約 1 分鐘內恢復,而且響應帶完整的響應頭和正文。處理方法見 網站或介面返回 502 怎麼辦

為什麼會被代理接管

  1. Python requests 會自動讀取系統代理。 在 Windows 上,它會讀取登錄檔裡的系統代理設定。Clash、v2rayN 這類軟體一旦開啟「系統代理」,你的指令碼就會悄悄走代理,程式碼裡完全看不出來。
  2. 明文 HTTP 請求由代理代發。http://api.apiyi.com:16888 這類明文地址時,代理不是隻做透明隧道,而是替你把請求重新發出去。代理節點抖動、切換或超時後,它會直接給你的腳本回一個空的 502。
  3. 大請求體和高併發會放大問題。 圖片編輯一次要上傳幾 MB 的圖片,單次生成要 45 到 70 秒。幾十個併發都擠在一個代理節點上,任何一次抖動都會讓一批請求同時失敗。
https:// 時,代理只負責搭一條加密隧道,出問題時通常表現為連線異常(比如 ProxyError),而不是偽造的 502。不過 HTTPS 請求照樣會經過代理,最終的解決辦法仍然是讓指令碼不走代理。

解決方法

1

確認指令碼有沒有走代理

在執行指令碼的同一個環境裡執行:
輸出裡有 httphttps 項(比如 127.0.0.1:7890),就說明 requests 預設會走這個代理。
2

讓指令碼繞開代理(任選一種)

只改單次請求也可以:requests.post(..., proxies={"http": None, "https": None})
3

重新跑一小批驗證

先用 5 到 10 個併發跑幾十次。空 502 消失,就說明是代理的問題。API易 國內可以直連,不需要代理,詳見 使用 API 介面需要代理網路嗎
http://api.apiyi.com:16888 是正式提供的明文介面,圖片場景用它可以降低延遲(見 圖片 API 延遲如何最佳化),可以繼續使用,前提是按上面的方法繞開代理。

常見疑問

分兩種情況:
  • 代理在請求發到 API易 之前就失敗了:API易 沒收到請求,不會扣費,呼叫日誌裡也沒有記錄。
  • 代理在請求已經發出、正在等待結果時斷開:API易 可能已經在處理這張圖,並照常計費,但結果沒能回到你的指令碼。
所以不要只看指令碼的報錯。請以 呼叫日誌 裡的記錄為準,核對實際扣費次數。
代理節點的抖動通常是間歇性的,重試時剛好趕上節點恢復,請求就過去了。但每次重試都要重新上傳整張圖,退避時間也越來越長,批次任務的總耗時會明顯變長。繞開代理才能根治。
修不了。這類失敗發生在你本機和 API易 之間的代理上,請求往往根本沒有到達 API易,或者是代理主動斷開了連線,服務端沒有辦法干預。
先看響應頭:如果帶 ServerDate,正文是 HTML 或 JSON,那就是平臺側的 502,按 網站或介面返回 502 怎麼辦 處理。如果持續出現,請把出錯時間(註明時區,如 14:30 (UTC+8))和完整響應發給客服。

相關文件

網站或介面返回 502 怎麼辦?

平臺側 502:容器短暫重啟,約 1 分鐘恢復

使用 API 介面需要代理網路嗎?

國內可直連,不需要代理或 VPN

圖片 API 延遲如何最佳化?

HTTP 介面、連線複用與超時設定

如何避免介面超時?

timeout 設定與逐層排查