學習記錄,不喜勿噴 什麼是OkHttp 一般在Java平臺上,我們會使用Apache HttpClient作為Http客戶端,用於發送 HTTP 請求,並對響應進行處理。比如可以使用http客戶端與第三方服務(如SSO服務)進行集成,當然還可以爬取網上的數據等。OKHttp與HttpClient類似 ...
學習記錄,不喜勿噴
什麼是OkHttp
一般在Java平臺上,我們會使用Apache HttpClient作為Http客戶端,用於發送 HTTP 請求,並對響應進行處理。比如可以使用http客戶端與第三方服務(如SSO服務)進行集成,當然還可以爬取網上的數據等。OKHttp與HttpClient類似,也是一個Http客戶端,提供了對 HTTP/2 和 SPDY 的支持,並提供了連接池,GZIP 壓縮和 HTTP 響應緩存功能。
OkHttp優點
(1)支持HTTP2/SPDY(SPDY是Google開發的基於TCP的傳輸層協議,用以最小化網路延遲,提升網路速度,優化用戶的網路使用體驗)
(2)socket自動選擇最好路線,並支持自動重連,擁有自動維護的socket連接池,減少握手次數,減少了請求延遲,共用Socket,減少對伺服器的請求次數
(3)基於Headers的緩存策略減少重覆的網路請求
(4)擁有Interceptors輕鬆處理請求與響應(自動處理GZip壓縮)
OkHttp功能
(1)一般的get請求
(2)一般的post請求
(3)基於Http的文件上傳
(4)文件下載
(5)上傳下載的進度回調
(6)載入圖片
(7)支持請求回調,直接返回對象、對象集合
(8)支持session的保持
(9)支持自簽名網站https的訪問,提供方法設置下證書就行
(10)支持取消某個請求
測試數據介面
package com.waves.controller; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @RestController @RequestMapping("/dataApi") public class ResponseDataController { @GetMapping("/getData") public Map<String,Object> getData(@RequestParam("pageIndex")String pageIndex){ Map<String,Object> map = new HashMap<>(); map.put("username","小明"); map.put("password","123456"); map.put("age","18"); map.put("endSchool","中國北京大學"); List<Map<String,Object>> list = new ArrayList<>(); list.add(map); Map<String,Object> map2 = new HashMap<>(); map2.put("total",list.size()); map2.put("code",200); map2.put("data",list); return map2; } @PostMapping("/postData") public Map<String,Object> postData(@RequestBody Map<String,Object> params){ Map<String,Object> map = new HashMap<>(); map.put("username","小紅"); map.put("password","123456"); map.put("age","18"); map.put("school","中國北京大學"); List<Map<String,Object>> list = new ArrayList<>(); list.add(map); Map<String,Object> map2 = new HashMap<>(); map2.put("total",list.size()); map2.put("code",200); map2.put("data",list); return map2; } }
OkHttp POST請求介面
package com.waves.controller; import com.alibaba.fastjson.JSONObject; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import org.springframework.web.bind.annotation.*; import java.io.IOException; import java.util.HashMap; import java.util.Map; @RestController @RequestMapping("/okHttpApi") public class OkHttpController { @PostMapping("/okHttpPost") public Map<String,Object> okHttpPost(@RequestBody Map<String,Object> params){ try { //json字元串的兩種形式 String k = "{\n" + "\t\"pageIndex\": \"1\",\n" + "\t\"pageSize\": \"10\",\n" + "\t\"userName\": \"xiaoming\"\n" + "}"; JSONObject json2 = new JSONObject(); json2.put("pageIndex","1"); json2.put("pageSize","20"); json2.put("userName","xiaoming"); //創建一個OkHttpClient OkHttpClient client = new OkHttpClient(); //設置請求頭 MediaType mediaType = MediaType.parse("application/json"); //請求體 okhttp3.RequestBody requestBody = okhttp3.RequestBody.create(mediaType,k); //創建一個request Request request = new Request.Builder() .post(requestBody) .url("http://localhost:8080/dataApi/postData") .addHeader("content-type","application/json") .build(); //獲得返回 Response response = client.newCall(request).execute(); if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); //獲取返回值 String responseData = response.body().string(); //將json字元串轉為JSONObject JSONObject data = JSONObject.parseObject(responseData); //將jsonObject 轉為Map Map<String,Object> map2 = data.toJavaObject(Map.class); return map2; }catch (Exception e){ return new HashMap<>(); } } }
OkHttp GET方式請求介面
@GetMapping("/okHttpGet") public Map<String,Object> okHttpGet(@RequestBody Map<String,Object> params){ try { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .get() .url("http://localhost:8080/dataApi/getData?pageIndex=1") // .addHeader("content-type","application/json") .build(); Response response = client.newCall(request).execute(); if (!response.isSuccessful()) throw new IOException("Unexpected code " + response); //獲取返回值 String responseData = response.body().string(); //將json字元串轉為JSONObject JSONObject data = JSONObject.parseObject(responseData); //將jsonObject 轉為Map Map<String,Object> map2 = data.toJavaObject(Map.class); return map2; }catch (Exception e){ return new HashMap<>(); } }
項目所需pom(依賴)
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.waves</groupId> <artifactId>waves_okhttp</artifactId> <version>0.0.1-SNAPSHOT</version> <name>waves_okhttp</name> <description>Okhtp project for Spring Boot</description> <properties> <java.version>1.8</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <spring-boot.version>2.3.7.RELEASE</spring-boot.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.72</version> </dependency> <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.9.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.3.7.RELEASE</version> <configuration> <mainClass>com.waves.WavesOkhttpApplication</mainClass> </configuration> <executions> <execution> <id>repackage</id> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>