OkHttp的使用

来源:互联网 发布:东航机长最新年薪 知乎 编辑:程序博客网 时间:2024/05/16 14:46

导入

首先如果使用eclipse 需要下载最新的jar包最新jar

如果使用android studio 则需要加入 compile“com.squareup.okhttp3:okhttp:3.6.0

1 get请求

1 首先需要发送一个get请求步骤 首先需要构造一个request对象 参数最起码需要一个url 可以通过Request.Builder设置更多参数
2 然后通过request对象去构造得到一个Call对象 相当于封装成了一个任务 然后就会有execute()和cancle()方法
3 最后我们用异步方式执行请求 调用了call.enqueue将call加入调度队列中然后等待任务执行完成 然后在callback中就可以得到结果

比如获取一个网页内容
//首先需要创建okhttpclient对象
okHttpClient client = new OkHttpClient();
//创建一个request请求
final Request request = new Request.Builer().url("https://github.com/kristch").build();
// new call
Call call = client.newCall(request);
//请求加入调度
call.enqueue(new Callback()
{@Override  
publicvoidonFailure(Request request, IOException e)  
{  
}  
@Override  
publicvoidonResponse(final Response response) throws IOException { //String htmlStr = response.body().string();  
}  
});
可以简单封装
okHttpclient client = new OkhttpClient();
String runGet(String url)throws IOException{
Request request = new Request.Builder().url("https://github.com/kristch").build();
Response reponse = client.newCall(request).execute();
if(reponse.isSuccesssful()){
return response.body().string();
}else{
throw new IOException();

}

2 Post

2.1提交键值对

FormEncodingBuilder builder =new FormEncodingBuilder();  
builder.add("username","123");
Request request =new Request.Builder().url(url).post(builder.build()) .build();
mOkHttpClient.newCall(request).enqueue(new Callback(){});
post的时候,参数是包含在请求体中的;所以我们通过FormEncodingBuilder。添加多个String键值对,然后去构造RequestBody,最后完成我们Request的构造
简单封装
okhttpclient client = new Okhttpclient();
String post(String url) throws Exception{
RequestBody formBody = new FormEncodingbuilder();
formBody.add("username","123");
Request request = new Request.Builder().url(url).post(formBody).build();
Response response = client.new Call(request).execute();
if(response.isSuccessful()){
return response.body().string();
}else{
}
}

2.2 post提交json数据

public static final MediaType JSON = MediaType.parse("application/json",charset=utf-8);
okhttpClient client = new OkhttpClient();
String post(String url,String json)throws IOException{
RequestBody body = RequestBody.create(JSON,json);
Request request = new Request.Builder(url).url().post(body).build();
Response response = client.newCall(request).execute();

if(response.isSuccessful()){

return response.body().string();
}else{
}

3 http文件上传

一个可以构造RequestBody的builder 叫做MultipartBuilder 当我们需要做类似于表单的上传
上传的时候就可以用这个
File file = new File(Environment.getExternalStorageDirectory(),"demo.mp4");
RequestBody fileBody = RequestBody.create(MeidaType.parse("application/octet-stream"), file));
RequestBody requestbody = new MultipartBuilder().type(MultipartBuilder.FORm) .addPart(Headers.of( "Content-Disposition","form-data; name=\"username\""), RequestBody.create(null,"123")) .addPart(Headers.of( "Content-Disposition","form-data; name=\"mFile\"; filename=\"wjd.mp4\""), fileBody) .build();
Request request = new Request.Builder().url(url).post(requestbody).build();
Call call = new OkhttpClient().newCall(request);
call.enqueue(new Callback(){
});
这段代码是向服务器传递了一个键值对username:123和一个视频文件,
MultipartBuilder的addPart方法可以添加键值对或者文件
4 文件下载
下载一个文件 用string形式打印响应体 如果小文档可以十分方便如果太大不要使用这个方法需要
使用流的方式来处理body
private final OkhttpClient client = new OkhttpClient();
public void run()throws Exception{
Rquest request = new Requst.Builder().url(url).build();

Response response = client.newCall(request).execute();
if(!response.isSuccessful())throw new IOException(""+response);
Headers res= response.headers();
for(int i=0;i<res.size();i++){
syso(res.name(i)+":"+res.value(i));
}
syso(res.body().string);
}
也可以
client.newCall(request).enqueue(new Callback(){
onFilure(){
throwable.printStackTrace();
}
onResponse(){
if(!response.isSuccessful())throw new IOException(""+response);
Headers res= response.headers();
for(int i=0;i<res.size();i++){
syso(res.name(i)+":"+res.value(i));
}
syso(res.body().string);
}
});
转载来自:张鸿洋博客 和泡在网上的日子的文章





0 0
原创粉丝点击