記一次.net使用httpclient中程式碼中使用response.EnsureSuccessStatusCode()引發的誤會

lovefoolself發表於2024-09-07

1.問題背景

有一個拉取第三方資料儲存到本地的需求,使用.net開發,使用httpClient傳送post請求。第三方介面裡面會校驗我們傳送的json資料,如果我們的資料格式不正確會丟擲異常。

2.返回的結果不同?

第一步,我用postman做了測試,對方的介面可以呼叫,正確和錯誤都可以返回。
第二步,我使用程式碼測試,發現傳送的json資料格式不正確的時候,返回的response裡面沒有錯誤資訊,只有Bad RequestException
這讓人大大不解

3.思考步驟

1.既然postman測試沒有問題,人家的介面就是沒有問題的,肯定是使用httpClient出了問題
2.研究哪裡出了問題,但是呼叫的程式碼是超級簡單的,哪邊不對呢?

4.問題解決

最後發現postman使用正確json在請求成功的時候,狀態200,成功輸出了資料
image
在資料格式不正確時,返回如下,也是返回了資料。但是等等!!! 狀態碼是400!!!
image
然後我看了下,我.net程式碼裡面有這樣一句話
response.EnsureSuccessStatusCode()
這行程式碼是毀滅性的,我們點選檢視他的原始碼。
image
再看一下他判斷的狀態的程式碼
image
這下就清楚了,當對方返回了400狀態後(雖然代入了異常資訊),因為那一行程式碼的緣故,response裡面不再是對方返回的異常資訊,而是我們自己的ex裡面的message。EnsureSuccessStatusCode方法丟擲了異常。
刪除這行程式碼,問題解決。

5.思考

1.我覺得加入EnsureSuccessStatusCode 並沒有問題,但是沒有正確理解這行程式碼,這行程式碼的意思是檢驗http狀態碼,不正確就丟擲異常
2.對方的介面是不好的介面。正確的方式應該返回的狀態碼依然是200,但是資訊是錯誤資訊。但是第三方的介面直接就丟擲了一個400的異常。
3.這裡有一個思考,介面有異常資訊是直接{400,message},還是{200.message},就是http請求一直是ok,只是用資訊標註請求的異常資訊。

相關文章