介面測試 OkHttpClient 基礎方法封裝
背景:
原本使用org.apache.commons.httpclient方法封裝進行http介面測試,由於支援非同步請求和H2不易,因此研究採用OkHttpClient方式進行
替換為了保證相容性,採用的方法調用盡量與原來的org.apache.commons .httpclient使用方法保持一致
OkHttpClient的強大大家大可百度瞅瞅
踩坑:
1.響應結果response.body()。字串一直不能正常顯示,後來改用原有封裝的讀位元組流轉字串方式解決
封裝:
構造方法
/ **
*建構函式初始化
* /
private OkHttpClientMethod(){
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.readTimeout(30,TimeUnit.SECONDS); //讀取超時
builder.connectTimeout(10,TimeUnit.SECONDS); //連線超時
builder.writeTimeout(60,TimeUnit.SECONDS); //寫入超時
//協議
列表<Protocol> protocols = new ArrayList <Protocol>();
protocols.add(Protocol.HTTP_1_1);
protocols.add(Protocol.HTTP_2);
builder.protocols(協議);
//ssl
HttpsUtils.SSLParams sslParams = HttpsUtils.getSslSocketFactory(null, null, null);
builder.hostnameVerifier(new HostnameVerifier() {
public boolean verify(String s, SSLSession sslSession) {
return true;
}
});
builder.sslSocketFactory(sslParams.sSLSocketFactory,sslParams.trustManager);
//cookie 自動儲存
builder.cookieJar(new CookieJar() {
public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
cookieStore.put(url.host(),cookies);
}
public List<Cookie> loadForRequest(HttpUrl url) {
List<Cookie> cookies = cookieStore.get(url.host());
return cookies != null ? cookies : new ArrayList<Cookie>();
}
});
mOkHttpClient = builder.build();
}
單例實現
/**
* 單例實現
* @return
*/
public static OkHttpClientMethod getInstance(){
if(mInstance == null){
synchronized (OkHttpClientMethod.class){
if(mInstance == null){
mInstance = new OkHttpClientMethod();
}
}
}
return mInstance;
}
設定Header頭
/**
* 設定Header頭
* @param headersParams
* @return
*/
private Headers setHeaders(Map<String,Object> headersParams){
Headers headers = null;
Headers.Builder headerBuilder = new Headers.Builder();
if(headersParams != null){
for (String key:headersParams.keySet()){
headerBuilder.add(key,headersParams.get(key).toString());
}
}
headers = headerBuilder.build();
return headers;
}
設定url引數拼接
/**
* 設定get連線拼接引數
* @param params
* @return
*/
private String setUrlParams(Map<String,Object> params){
StringBuffer param = new StringBuffer();
int i = 0;
if(params == null){
return param.toString();
}
for (String key : params.keySet()) {
if (i == 0)
param.append("?");
else
param.append("&");
try {
param.append(key).append("=").append(URLEncoder.encode(params.get(key).toString(),"UTF-8")); //字串拼接
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
i++;
}
return param.toString();
}
設定Post表單請求
/**
* 設定post表單請求
* @param params
* @return
*/
private RequestBody setPostBody(Map<String,Object> params){
RequestBody body = null;
FormBody.Builder formBodyBuilder = new FormBody.Builder();
if(params != null){
for (String key:params.keySet()){
formBodyBuilder.add(key,params.get(key).toString());
}
}
body = formBodyBuilder.build();
return body;
}
get方法封裝
/**
* Get請求
* @param url
* @param urlParams
* @param headerParams
* @return
*/
public Object getMethod(String url,Map<String, Object> urlParams, Map<String, Object> headerParams){
Request request = new Request.Builder()
.url(url + setUrlParams(urlParams))
.headers(setHeaders(headerParams))
.get()
.build();
Call call = mOkHttpClient.newCall(request);
JSONObject jsonResult = new JSONObject();
log.info("Http info:" + request.toString());
log.info("Http Header:" + request.headers().toString());
try {
Response response = call.execute();
String result = InputStreamUtils.inputStreamTOString(response.body().byteStream(),"UTF-8");
log.info("Http Result:" + result);
if (response.isSuccessful()){
jsonResult = JSONObject.fromObject(result);
return jsonResult;
}
} catch (Exception e) {
e.printStackTrace();
}
return jsonResult;
}
非同步Get方法封裝
/**
* 非同步Get請求
* @param url
* @param urlParams
* @param headerParams
* @return
*/
public void getAsyncMethod(String url,Map<String, Object> urlParams, Map<String, Object> headerParams,OkHttpClientCallBack okHttpRequestCallBack){
Request request = new Request.Builder()
.url(url + setUrlParams(urlParams))
.headers(setHeaders(headerParams))
.get()
.build();
Call call = mOkHttpClient.newCall(request);
log.info("Http info:" + request.toString());
log.info("Http Header:" + request.headers().toString());
try {
call.enqueue(okHttpRequestCallBack);
} catch (Exception e) {
e.printStackTrace();
}
}
非同步Get原生封裝
/**
* 非同步Get請求 原生
* @param url
* @param urlParams
* @param headerParams
* @return
*/
public void getAsyncNativeMethod(String url,Map<String, Object> urlParams, Map<String, Object> headerParams,Callback callback){
Request request = new Request.Builder()
.url(url + setUrlParams(urlParams))
.headers(setHeaders(headerParams))
.get()
.build();
Call call = mOkHttpClient.newCall(request);
log.info("Http info:" + request.toString());
log.info("Http Header:" + request.headers().toString());
try {
call.enqueue(callback);
} catch (Exception e) {
e.printStackTrace();
}
}
非同步Post請求
/**
* 非同步Post請求
* @param url
* @param urlParams
* @param bodyParams
* @param headerParams
* @return
*/
public void postAsyncMethod(String url, Map<String, Object> urlParams, Map<String, Object> bodyParams, Map<String, Object> headerParams,OkHttpClientCallBack okHttpRequestCallBack){
Request request = new Request.Builder()
.url(url + setUrlParams(urlParams))
.headers(setHeaders(headerParams))
.post(setPostBody(bodyParams))
.build();
Call call = mOkHttpClient.newCall(request);
log.info("Http info:" + request.toString());
log.info("Http Header:" + request.headers().toString());
log.info("Http params:" + request.body().toString());
try {
call.enqueue(okHttpRequestCallBack);
} catch (Exception e) {
e.printStackTrace();
}
}
非同步post JSON請求封裝
/**
* 傳送JSON 非同步post請求
* @param url
* @param urlParams
* @param jsonParams
* @param headerParams
* @return
*/
public void postJsonAsyncMethod(String url,Map<String,Object> urlParams,Object jsonParams,Map<String,Object> headerParams,OkHttpClientCallBack okHttpRequestCallBack){
RequestBody requestBody = FormBody.create(MediaType.parse("application/json"),JSONObject.fromObject(jsonParams).toString());
Request request = new Request.Builder()
.url(url + setUrlParams(urlParams))
.headers(setHeaders(headerParams))
.post(requestBody)
.build();
Call call = mOkHttpClient.newCall(request);
log.info("Http info:" + request.toString());
log.info("Http Header:" + request.headers().toString());
log.info("Http params:" + request.body().toString());
try {
call.enqueue(okHttpRequestCallBack);
} catch (Exception e) {
e.printStackTrace();
}
}
呼叫方式
/**
* 測試 JSON 非同步JSON請求
*/
@Test
public void testPostAsnycJsonHttp() throws Exception{
//設定url
String url = "http://192.168.3.14:8980/xxxxxxxxx";
Map<String,Object> headers = new HashMap<String,Object>();
headers.put("Content-Type","application/json");
headers.put("Connection","Upgrade, HTTP2-Settings");
headers.put("Upgrade","h2c");
JSONObject params = new JSONObject();
params.put("searchAll",0);
OkHttpClientCallBack okHttpClientCallBack = new OkHttpClientCallBack();
OkHttpClientMethod okHttpClientMethod = OkHttpClientMethod.getInstance();
okHttpClientMethod.postJsonAsyncMethod(url,null,params,headers,okHttpClientCallBack);
for(int i = 0; i <10; i ++){
System.out.println(“我是主執行緒,執行緒Id為:”+ Thread.currentThread()。getId());
嘗試{
Thread.currentThread()。sleep(100);
} catch(InterruptedException e){
e.printStackTrace();
}
}
Long beforeTime = System.currentTimeMillis();
System.out.println(“你說啥就是啥:”+ beforeTime);
的System.out.println(okHttpClientCallBack.getResult());
Long afterTime = System.currentTimeMillis();
System.out.println(“該幹啥就幹啥:”+ Long.toString(afterTime - beforeTime));
}