python接口自動化(十八)--重定向(Location)(詳解)
時間:2023-02-09 01:39:01 | 來源:建站知識
時間:2023-02-09 01:39:01 來源:建站知識
簡介
在實際工作中,有些接口請求完以后會重定向到別的url,而你卻需要重定向前的url。URL主要是針對虛擬空間而言,因為不是自己獨立管理的服務(wù)器,所以無法正常進行常規(guī)的操作。但是自己又不希望通過主域名的二級目錄進行訪問,而
是希望通過主域名的二級域名進行訪問。所以這個時候就會用到URL重定向。
重定向過程好比有個綽號叫“瀏覽器”的人寫信找張三借錢,張三回信說沒有錢,讓“瀏覽器”去找李四借,并將李四現(xiàn)在的通信地址告訴給了“瀏覽器 ”。于是,“瀏覽器”又按張三提供通信地址給李四寫信借錢,李四收到信后就把錢匯給了“瀏覽
器”。可見,“瀏覽器”一共發(fā)出了兩封信和收到了兩次回復(fù),“ 瀏覽器”也知道他借到的錢出自李四之手。具體可以通過 HttpServletResponse.sendRedirect 實現(xiàn)。
RequestDispatcher.forward 方法在服務(wù)器端內(nèi)部將請求轉(zhuǎn)發(fā)給另外一個資源,瀏覽器只知道發(fā)出了請求并得到了響應(yīng)結(jié)果,并不知道在服務(wù)器程序內(nèi)部發(fā)生了轉(zhuǎn)發(fā)行為。這個過程好比綽號叫“ 瀏覽器”的人寫信找張三借錢,張三沒有錢,于
是張三找李四借了一些錢,甚至還可以加上自己的一些錢,然后再將這些錢匯給了“瀏覽器”??梢?,“瀏覽器”只 發(fā)出了一封信和收到了一次回復(fù),他只知道從張三那里借到了錢,并不知道有一部分錢出自李四之手。
1、請求轉(zhuǎn)發(fā)(requestDispatcher)
該動作是服務(wù)器行為,在web容器中進行的,客戶端對于跳轉(zhuǎn)是不知道的,地址欄中顯示的URL是不會變化的,因為請求轉(zhuǎn)發(fā)中是一次請求,相同的request,可以在請求中設(shè)置屬性對象(setAttribute())來實現(xiàn)數(shù)據(jù)共享
request.getRequestDispatcher(URL).forward(request,response);
2、請求重定向(sendRedirect,也稱為間接的請求轉(zhuǎn)發(fā))
該動作是客戶端行為,服務(wù)器會向客戶端返回一個301狀態(tài)碼并攜帶一個Location屬性表名應(yīng)請求的地址,然后客戶端按照服務(wù)器返回的地址重新發(fā)送請求,地址欄中顯示的URL是會變化的因為請求重定向中是兩次不同的請求request,無法實
現(xiàn)數(shù)據(jù)共享
response.sendRedirect(URL);
重定向
URL重定向主要是指主域名主域名
http://www.xusseo.com下的二級目錄,如
http://www.xusseo.com/wap,但是由于wap是一個新的站點,所以正確的域名應(yīng)該是應(yīng)該是
http://wap.xusseo.com。但是訪問的文件夾卻是
http://www.xusseo.com/wap,這種訪問則被
稱之為重定向。
常見的重定向分為301重定向和302重定向。重定向是一種比較特別的優(yōu)化方式,因為需要通過代碼來實現(xiàn),從而變相提高權(quán)重值。所以在特殊情況下,如果使用重定向過于嚴重,則會被搜索引擎判定為不是正當(dāng)?shù)膬?yōu)化。
1、301重定向代表永久性轉(zhuǎn)移(Permanently Moved)
301重定向被稱之為永久性重定向,主要是針對一些永久性更改的網(wǎng)站,而且這種重定向一旦做好,將會對網(wǎng)站的優(yōu)化大有好處。
2、302重定向代表暫時性轉(zhuǎn)移(Temporarily Moved )
302重定向的使用并不多見,它通常被稱之為暫時性的轉(zhuǎn)移。302重定向的使用常見于meta重定向和JavaScript重定向。而這種重定向是典型的不正當(dāng)行為,很容易被搜索引擎發(fā)現(xiàn),并將其重定向的網(wǎng)址定義為不合法網(wǎng)站,做出懲罰。
3、以博客園舉個簡單的場景案例,先登錄博客園打開我的博客首頁,進入任意一個頁面都可以,在這里進我的隨筆編輯界面,記住這個地址:
https://i.cnblogs.com/EditPosts.aspx?opt=14.退出博客園登錄,把剛才我的隨筆這個地址
https://i.cnblogs.com/EditPosts.aspx?opt=1輸入瀏覽器回車,抓包會看到這個請求狀態(tài)碼是 302,瀏覽器地址欄瞬間刷新跳到登錄首頁去了
禁止重定向(allow_redirects)
1、用 get 方法請求:
https://i.cnblogs.com/EditPosts.aspx?opt=12、打印狀態(tài)碼是 200,這是因為 requets 庫自動處理了重定向請求了,這里留作疑問。聰明的你一定或許猜到了,不知道的后邊帶你去解密,筆者就喜歡抽絲剝繭的那種感覺,帶你一層一層揭開它神秘的面紗
3、自動處理重定向地址后,我們就獲取不到重定向后的 url 了,就無法走下一步,這里我們可以設(shè)置一個參數(shù)禁止重定向:allow_redirects=False(allow_redirects=True 是啟動重定向),然后就可以看到 status_code 是 302 了
獲取重定向后地址
1、在第一個請求后,服務(wù)器會下發(fā)一個新的請求鏈接,在 response 的 headers 里,如下抓包:Location
2、代碼實現(xiàn)獲取Location 地址
3、參考代碼
1 # coding:utf-8 2 import requests 3 # 請求頭 4 headers = { 5 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" 6 } 7 s = requests.session() 8 # 打開我的隨筆 9 r = s.get('
https://i.cnblogs.com/EditPosts.aspx?opt=1', 10 headers=headers, 11 allow_redirects=False, 12 verify=False) 13 # 打印狀態(tài)碼,自動處理重定向請求 14 print (r.status_code) 15 new_url = r.headers["Location"] 16 print (new_url)
小結(jié)
在工作和學(xué)習(xí)中,我們不僅需要知其然,還必須知其所以然。前邊留的疑問或許你已經(jīng)查資料知道其原因了。我這里還是用老辦法,看源碼!看源碼!看源碼!重要的事說三遍。
1、從get方法入手
我們知道使用requests的get方法傳入url就可以訪問此網(wǎng)站,但是這個過程是怎么做的呢,今天就帶著這個疑問對其進行進一步探究。
打開pycharm,在pycharm中通過ctrl(command)+ ?左鍵我們可以定位到方法的位置。
我們首先進入sessions.py文件,看到get方法如下:
可以發(fā)現(xiàn)該方法就兩句話
先看第一句,
kwargs.setdefault('allow_redirects', True)
,下面我們來說說kwargs在這里的用處
2、kwargs
kwargs是字典類型,setdefault的作用是給字典鍵名allow_redirects賦值,如果該鍵不存在,賦給其默認值,也就是第二參數(shù)True。
好了到此為止,就解決大家的疑問了,有興趣的小伙伴可以繼續(xù)往下分析。
為了方便大家在移動端也能看到我分享的博文,現(xiàn)已注冊個人微信公眾號,掃描左下方二維碼即可,歡迎大家關(guān)注,有時間會及時分享相關(guān)技術(shù)博文。 為了方便大家互動討論相關(guān)技術(shù)問題,現(xiàn)已組建專門的微信群,由于微信群滿100,請您掃描右下方宏哥個人微信二維碼拉你進群(請務(wù)必備注:進群),歡迎大家加入這個大家庭,我們一起暢游知識的海洋。 感謝您花時間閱讀此篇文章,如果您覺得這篇文章你學(xué)到了東西也是為了犒勞下博主的碼字不易不妨打賞一下吧,讓博主能喝上一杯咖啡,在此謝過了!
如果您覺得閱讀本文對您有幫助,請點一下左下角
“推薦”按鈕,您的
“推薦”將是我最大的寫作動力!另外您也可以選擇
a href="">【關(guān)注我】,可以很方便找到我!
本文版權(quán)歸作者和博客園共有,來源網(wǎng)址:
https://www.cnblogs.com/du-hong 歡迎各位轉(zhuǎn)載,但是未經(jīng)作者本人同意,轉(zhuǎn)載文章之后必須在文章頁面明顯位置給出作者和原文連接,否則保留追究法律責(zé)任的權(quán)利!
http://weixin.qq.com/r/LS8vK3-EtrfKKTtIb3qp (二維碼自動識別)
https://u.wechat.com/MMAM8iZlmjp7P6FSjrypXKM (二維碼自動識別)