一:概述
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,添加多個值與健。