一:概述
1.說明
java與android都可以使用。
是網絡請求的開源框架。
square公司開發,用於替代HttpUrlConnection和Apache HttpClient
2.優點
- 支持HTTP2/SPDY(SPDY是Google開發的基於TCP的傳輸層協議,用以最小化網絡延遲,提升網絡速度,優化用戶的網絡使用體驗。)
- socket自動選擇最好路線,並支持自動重連,擁有自動維護的socket連接池,減少握手次數,減少了請求延遲,共享Socket,減少對服務器的請求次數。
- 基於Headers的緩存策略減少重復的網絡請求。
- 擁有Interceptors輕松處理請求與響應(自動處理GZip壓縮)。
3.功能
- PUT,DELETE,POST,GET等請求
- 文件的上傳下載
- 加載圖片(內部會圖片大小自動壓縮)
- 支持請求回調,直接返回對象、對象集合
- 支持session的保持
4.准備項目
在這里需要使用兩個項目進行實驗。
調用的項目:
需要添加使用okhttp包,使用端口8090.

被調用的項目:
使用端口8080
是一個普通的項目即可。
二:程序GET
1.get的普通使用
被調用程序
package com.jun.web2forokhttp.okhttp;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
public class GetReq {
@GetMapping("/ok/getInfo")
public Map getInfo(@RequestParam("type") String type){
Map map =new HashMap();
if("1".equals(type)){
map.put("1","aa");
map.put("2","bb");
}else {
map.put("3","cc");
map.put("4","dd");
}
return map;
}
}
2.調用程序
package com.jun.web.okhttp;
import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class GetHttp {
public static void main(String[] args) {
withoutHeader();
}
public static void withoutHeader(){
String url="http://localhost:8080/ok/getInfo?type=18";
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
Call call = client.newCall(request);
try{
Response response = call.execute();
System.out.println("get="+response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}
效果:

3.request的請求頭中添加參數
被調用程序
package com.jun.web2forokhttp.okhttp;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
public class GetReq {
/**
* 普通的get請求
* @param type
* @return
*/
@GetMapping("/ok/getInfo")
public Map getInfo(@RequestParam("type") String type){
Map map =new HashMap();
if("1".equals(type)){
map.put("1","aa");
map.put("2","bb");
}else {
map.put("3","cc");
map.put("4","dd");
}
return map;
}
/**
* 參數從請求頭中獲取
* @param type
* @return
*/
@GetMapping("/ok/getMoreInfo")
public Map getMoreInfo(@RequestParam("type") String type, @RequestHeader("cjtoken") String cjToken){
Map map =new HashMap();
if("1".equals(type)){
map.put("1","aa");
map.put("2","bb");
map.put("cjtoken",cjToken);
}else {
map.put("3","cc");
map.put("4","dd");
map.put("cjtoken",cjToken);
}
return map;
}
}
4.調用程序
package com.jun.web.okhttp;
import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class GetHttp {
public static void main(String[] args) {
// withoutHeader();
withHeader();
}
/**
* 沒有請求頭的請求
*/
public static void withoutHeader(){
String url="http://localhost:8080/ok/getInfo?type=18";
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.header("cjtoken","8765095321")
.build();
Call call = client.newCall(request);
try{
Response response = call.execute();
System.out.println("get="+response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 有請求頭的請求
*/
public static void withHeader(){
String url="http://localhost:8080/ok/getMoreInfo?type=18";
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.header("cjtoken","8765095321")
.build();
Call call = client.newCall(request);
try{
Response response = call.execute();
System.out.println("get="+response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
}
效果:

三:注意點
1.返回值
string()只是其中之一。
- onResponse回調有一個參數是response
如果想獲得返回的是字符串,可以通過response.body().string()
如果獲得返回的二進制字節數組,則調用response.body().bytes()
如果想拿到返回的inputStream,則調response.body().byteStream()
有inputStream我們就可以通過IO的方式寫文件
使用response.code()獲取返回的狀態碼。如果成功,則是200.
2.header
可以寫多個header,添加多個值與健。
