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