一、GET传输
①、OkHttp默认使用GET传输
②、使用Request发送请求。
③、使用Response接收服务器的请求。
④、通过CallBack接口回调来处理接收的时候。 OkHttp提供异步,和非异步两种方式。
示例:
public static void main(String[]args){
//创建OkHttpClient
OkHttpClient client = new OkHttpClient();
//创建请求类。通过使用Builder来构造Request类,默认GET传输
Request request = new Request.Builder()
.url("https://www.zhihu.com/")
.build();
//创建用来连接服务器的Call类
Call call = client.newCall(request);
//将Callback回调,放入队列中。 执行异步任务
call.enqueue(new Callback() {
@Override
public void onResponse(Call arg0, Response arg1) throws IOException {
// TODO Auto-generated method stub
//判断是否成功连接服务器,并返回数据
if (arg1.isSuccessful()){
//获取返回数据的内容
System.out.println(arg1.body().string());
}
}
@Override
public void onFailure(Call arg0, IOException arg1) {
// TODO Auto-generated method stub
}
});
try {
//直接在该线程中执行任务,阻塞队列,等待服务器返回结果生成Response对象
Response response = call.execute();
System.out.println(response.body().string());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
补充基础:
①、如何设置Header
Request request = new Request.Builder()
.addHeader("Content-Type", "text-plain")
.header("host", "...")
.build();
通过使用addHeader()和header()方法通过键值对的形式来创建请求的头部。
addHeader()的header()的区别:
addHeader():当存在相同的键名时候,不会覆盖该键名的数据,而是添加数据。
header():会覆盖当前相同键名的数据
②、如何通过Response获取服务器传回的数据
//获取全部的头部数据
Headers headers = response.headers();
//遍历数据(详细方法请参照api文档)
for(String name : headers.names()){
System.out.println(headers.get(name));
}
//获取全部的内容数据
ResponseBody body = response.body();
//由于数据是存放在内存的,所以当内容数据小于1M就能直接接收。
String str = body.string();
//但是当大于1M的时候,就要通过流,传输到硬盘中
InputStream is = body.byteStream();
①、上传简单key-value
OkHttpClient client = new OkHttpClient();
//创建上传的数据(仿表单的形式)
FormBody body = new FormBody.Builder()
.add("name", "chen")
.add("pwd", "hello")
.build();
//创建请求类,设定为Post请求,并放入要上传的数据
Request request = new Request.Builder()
.url("https://www.zhihu.com/")
.post(body)
.build();
②、上传单个文件
public static final MediaType MEDIA_TYPE_FILE = MediaType.parse("application/octet-stream;charset:utf-8");
public static void main(String[]args){
OkHttpClient client = new OkHttpClient();
//将Body设置为表单,然后通过addFormDataPart()上传表单。
MultipartBody body = new MultipartBody.Builder().setType(MultipartBody.FORM)
.addFormDataPart("data", "da.txt", RequestBody.create(MEDIA_TYPE_FILE, new File("asda")))
.build();
Request request = new Request.Builder()
.url("https://www.zhihu.com/")
.post(body)
.build();
}
原理:
表单上传文件的html表示:
Content-Disposition:form-data;name="images"
filename="storage/emulated/0/Camera/picture/tempeter.jpg"
Content-Type: application/octet-stream
这里是文件的二进制数据...
name = "data" fileName = "da.txt" Content-Type: MEDIA_TYPE_FILE
数据就是:new File("asda");
③、通过表单上传多个数据(文件,普通键值对) (简称复合请求)
RequestBody body = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
//上传文件
.addPart(Headers.of("Content-Disposition","format-data;name=\"image\";filename=\"icon.png\""),
RequestBody.create(MEDIA_TYPE_FILE, new File("image.png")))
//上传普通键值对。
.addPart(Headers.of("Content-Disposition","format-data;name=\"name\""),
RequestBody.create(null, "chen"))
.build();
}