1. 程式人生 > >okhttp post 重定向引數丟失 跨協議重定向

okhttp post 重定向引數丟失 跨協議重定向

序言

最近的專案中,一個已經開發多時的介面突然就不能用了。抓包發現,原來是由於重定向引起的bug。發現了兩個。

問題1.

如果遇到301,302等重定向,則會忽略原來的請求方式,統一使用GET方式。如果原來使用的是POST方式,則會丟失引數。如下圖
post請求中有一個userId引數

重定向以後變成GET請求,引數丟失,請求失敗

問題2.

okhttp原始碼中不支援跨協議重定向。如下圖

看第三行紅字

通過抓包發現,每一次點選重試,okhttp遇到301重定向到https時都報錯而不會自動重定向。下面一個301都是一次請求的結果。
image

解決

為了解決這個問題我寫了一個攔截器。


import java.io.IOException;

import okhttp3.HttpUrl;
import
okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; /** * okhttp重定向存在兩個缺陷: * 1.okhttp處理301,302重定向時,會把請求方式設定為GET * 這樣會丟失原來Post請求中的引數。 * * 2.okhttp預設不支援跨協議的重定向,比如http重定向到https * * 為了解決這兩個問題寫了這個攔截器 * Created by zhuguohui on 2017/11/9. */ class RedirectInterceptor implements Interceptor { @Override
public Response intercept(Chain chain) throws IOException { Request request = chain.request(); HttpUrl beforeUrl = request.url(); Response response = chain.proceed(request); HttpUrl afterUrl = response.request().url(); //1.根據url判斷是否是重定向 if(!beforeUrl.equals(afterUrl)) { //處理兩種情況 1、跨協議 2、原先不是GET請求。
if (!beforeUrl.scheme().equals(afterUrl.scheme())||!request.method().equals("GET")) { //重新請求 Request newRequest = request.newBuilder().url(response.request().url()).build(); response = chain.proceed(newRequest); } } return response; } }

總結

遇到這類問題,其實很難發現,因為後臺以為只是簡單的做一個對映可能都不會通知移動人員,然而如果是已上線的專案這麼做照成大面積介面不可用必然是我們不想看到的。遇到這類問題,關鍵還是要通過抓包來分析問題,同時必須熟悉HTTP協議。

參考文件

相關推薦

okhttp post 定向引數丟失 協議定向

序言 最近的專案中,一個已經開發多時的介面突然就不能用了。抓包發現,原來是由於重定向引起的bug。發現了兩個。 問題1. 如果遇到301,302等重定向,則會忽略原來的請求方式,統一使用GET方式。如果原來使用的是POST方式,則會丟失引數。如下圖

【筆記】定向中使用Ajax(XHR請求)導致域失敗

兩個 led stat -h java cut 報錯 blank direct 背景: 1、前端Web中有兩個域名,a.com和b.com,其中a.com是訪問主站(頁面),b.com是數據提交接口的服務器(XHR請求) 2、a.com中用XHR調用b.com/cerate

前後端分離 ajax同域定向定向

前提:前端控制頁面跳轉,後端只提供介面,返回json格式資料,因此前端請求均是ajax請求 同域 伺服器端重定向:response.sendRedirect(url) ajax請求接收到狀態碼:302,同時response header 中增加Location欄位,瀏覽器會自動重定向

使用Httpclient(post請求)上傳檔案及其他引數到https協議的伺服器

最近有一個需求要用到httpclient大概如下:    運用httpclient傳送請求到一個https的伺服器,其中一個引數就是一個xml檔案,也就是需要把檔案傳上去, 而且有其他的引數,如果用普

基於應用層協議定向的GSLB《CDN技術詳解》

應用層重定向主要利用了HTTP、MMS、RTSP等協議本身的重定向機制來實現,由於各種應用層協議的重定向機制基本相同,因此以HTTP協議為例,介紹相關的知識。 1. HTTP重定向基本原理 在HTTP協議中,有三類重定向狀態碼:301 redirect、302

Jmeter使用筆記(本文偏"介面測試工具")【GET/POST的HTTP請求、請求頭、響應斷言、正則表示式提取器、CSV讀取引數執行緒組傳遞變數】

一、執行一個HTTP請求自從畢業從事軟體測試行業,大多數時間都在跟各種API打交道,使用過的介面測試工具也有許多,本文記錄下各工具的使用心得,以及重點介紹我在工作中是如何使用Jmeter做測試的,都是在windows作業系統下進行。最開始使用postman,該工具的優點是可以

Android OkHttp Post上傳檔案並且攜帶引數

這裡整理一下 OkHttp 的 post 在上傳檔案的同時,也要攜帶請求引數的方法。 使用 OkHttp 版本如下: compile 'com.squareup.okhttp3:okhttp:3.4.1' 程式碼如下: protected void po

OkHttp Post上傳檔案,攜帶引數

使用 OkHttp 版本如下: compile 'com.squareup.okhttp3:okhttp:3.4.1' public void upLoadFile(final

SSO單點登入、定向域設定Cookie、京東單點登入例項分析

最近在研究SSO單點登入技術,其中有一種就是通過js的跨域設定cookie來達到單點登入目的的,下面就已京東商城為例來解釋下跨域設定cookie的過程 涉及的關鍵知識點: 1、jquery ajax跨域重定向,要理ajax解跨域重定向,先要了解瀏覽器對重定向的處理。正常我們

Kafka消息投遞語義-消息不丟失,不復,不丟不

日誌 pac tps 啟動 事務性 enc 解決 tof 重新啟動 目錄 1. Kafka消息投遞語義-消息不丟失,不重復,不丟不重 1.1. 介紹 1.2. Producer 消息生產者端 1.3. Broker 消息接收端 1.4. Consumer 消息消費

Nginx啟時丟失nginx.pid文件

做了 重載 快速 名稱 kill 查看 round 但是 進行 nginx被停止(nginx -s stop)或者直接殺掉了進程(kill -9 nginx的進程號)後,調用命令(nginx -s reload 或者 nginx -s reopen)會報錯:無法找到&quo

node網頁post提交以及伺服器處理

網頁   <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script s

Post方式與引數詳解

定義和用法 enctype 屬性規定在傳送到伺服器之前應該如何對錶單資料進行編碼。 預設地,表單資料會編碼為 "application/x-www-form-urlencoded"。就是說,在傳送到伺服器之前,所有字元都會進行編碼(空格轉換為 "+" 加號,特殊符號轉換為 ASCII HEX 值

010-nodejs解析收到的post請求的引數

    先說直接用url模組就可以解析的 這是最簡單的 等下再說複雜的     app.post('/add', function (req, res) { console.log(url.parse(req.url)

iOS POST請求,引數編碼問題,引數編碼GBK

編碼問題-UTF8 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]]; request.HTTPMethod = @"POST"; re

HttpClient Post提交 帶引數

/* * HttpClient Post提交 帶引數 */ @Test public void fun4() throws ClientProtocolException, IOException{ //1、建立HttpClient CloseableHttpClient

vue.js通過路由跳轉傳參,重新整理頁面引數丟失

問題:vue.js路由跳轉,跳轉頁面重新整理後引數丟失,沒有資料,怎麼解決?? 出現的情況:從新聞列表頁面進入某一條新聞得詳情頁,需要在路由跳轉時給詳情頁面傳送該條新聞得ID,然後詳情頁獲取ID想後臺請求資料將內容展示,還有商品詳情頁等等~ 下面寫了一個小例子,是模擬專案的新聞列表和詳情頁,

再談Redirect 客戶端定向 和Dispatch 伺服器端定向

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Vue vue-resource 全域性攔截器 Post、Get、Jsonp域請求、配置請求 全域性路徑配置

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../n

三十七、小程式頁面跳轉傳參引數值為url時引數丟失

當引數的值為url的時候,在options中的值沒有引數“?”之後字串被擷取。例如:let url="http://baidu.com/?a=1&b=2"wx.navigateTo({url: `detail?url=${url}`})可以使用encodeURIComponent():函式可把字串作為