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