学习记录,不喜勿喷

什么是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 getData(@RequestParam("pageIndex")String pageIndex){        Map  map = new HashMap();        map.put("username","小明");        map.put("password","123456");        map.put("age","18");        map.put("endSchool","中国北京大学");        List<Map> list = new ArrayList();        list.add(map);        Map  map2 = new HashMap();        map2.put("total",list.size());        map2.put("code",200);        map2.put("data",list);        return map2;    }    @PostMapping("/postData")    public Map postData(@RequestBody  Map params){        Map  map = new HashMap();        map.put("username","小红");        map.put("password","123456");        map.put("age","18");        map.put("school","中国北京大学");        List<Map> list = new ArrayList();        list.add(map);        Map  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 okHttpPost(@RequestBody Map 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 map2 = data.toJavaObject(Map.class);            return map2;        }catch (Exception e){            return new HashMap();        }    }}

OkHttp GET方式请求接口

    @GetMapping("/okHttpGet")    public Map okHttpGet(@RequestBody Map 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 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>