問題現象:
場景:終端使用POST方法訪問/qacenter/v1/test-records接口時,需要重定向跳轉到/qacenterinner/v1/test-records接口
實現:
tornado代碼
# 增
async def post(self):
return self.redirect("/qacenterinner/v1/test-reports", status=307)
使用POSTMAN訪問接口,報錯405 method not allowed, 查看tornado打印如下:
[I 200506 09:34:54 web:2246] 302 POST /qacenter/v1/test-records (192.168.63.56) 0.71ms
[W 200506 09:34:54 web:2246] 405 GET /qacenterinner/v1/test-records (192.168.63.56) 0.49ms
問題描述:
使用Tornado 重定向後,發現POSTMAN的請求方法發生了變化,從POST變成了GET
Tornado 重定向使用方法: https://www.tornadoweb.org/en/latest/web.html?highlight=redirect#tornado.web.RequestHandler.redirect
問題分析:
POSTMAN發送請求時,有以下設置,嘗試打開Follow original HTTP Method,這樣重定向後的請求方法就不會發生變化了。
更改後,發現,第二次的請求方法確實變成了POST,但是很遺憾的時,請求body爲空。
這當然時不符合我們的預期的!那到底是什麼原因導致的呢?以及如何解決呢?
問題分析:
實際上,tornado的redirect方法默認返回的是302狀態碼,而在標準HTTP 1.1協議中,有以下約定
所以,不論是瀏覽器、postman還是python 中的requests,都會在302重定向之後請求方法變成了get。
解決辦法:
修改服務端響應碼爲307或308即可,在tornado中指定響應status,修改如下:
async def post(self):
return self.redirect("/qacenterinner/v1/test-records", status=307)
修改後,驗證問題解決。
[I 200506 09:44:23 web:2246] 307 POST /qacenter/v1/test-records (192.168.63.56) 0.65ms
[I 200506 09:44:23 web:2246] 201 POST /qacenterinner/v1/test-records (192.168.63.56) 62.78ms
參考資料:
How can tornado set_status 307
MDN web docs: HTTP 的重定向