OKHttp支持同步请求和异步请求,建议使用封装为工具类的方法。https://blog.csdn.net/river66/article/details/86570757
1、get的同步请求(同步请求时需要开启子线程,请求成功后需要跳转到UI线程修改UI)
public void getDatasync(){
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象
Request request = new Request.Builder()
.url("http://www.baidu.com")//请求接口。如果需要传参拼接到接口后面。
.build();//创建Request 对象
Response response = null;
response = client.newCall(request).execute();//得到Response 对象
if (response.isSuccessful()) {
Log.d("kwwl","response.code()=="+response.code());
Log.d("kwwl","response.message()=="+response.message());
Log.d("kwwl","res=="+response.body().string());
//此时的代码执行在子线程,修改UI的操作请使用handler跳转到UI线程。
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
打印结果:
response.code()==200;
response.message()==OK;
res=={“code”:200,”message”:success};
tip:response.body().string()只能调用一次,第二字调用返回null,原因:此方法是流操作
2、get异步请求(回调方法是执行在子线程中的,更新UI还是需要跳转到UI线程中才可以修改)
public void getDataAsync() {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
client.newCall(request).enqueue(new Callback() {//队列queue->异步
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()){//回调的方法执行在子线程。
Log.d("kwwl","获取数据成功了");
Log.d("kwwl","response.code()=="+response.code());
Log.d("kwwl","response.body().string()=="+response.body().string());
}
}
});
}
tip:不管是同步还是异步,response.body().string()方法必须放在子线程中
3、可以带普通参数的post异步请求(使用到了formBody)
public void postDataWithParam(){
FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
formBody.add("username","river");//传递键值对参数
Request request = new Request.Builder()//创建Request 对象。
.url("http://www.baidu.com")
.post(formBody.build())//传递请求体
.build();
client.newCall(request).enqueue(new Callback() {...});//省略回调方法
}
4、可以带json参数或者file对象的post异步请求(使用到了RequestBody)
public void jsonPost(String url,String json){
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
MediaType JSON = MediaType.parse("application/json; charset=utf-8");//数据类型为json格式
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
client.newCall(request).enqueue(new Callback() {。。。});//此处省略回调方法。
}
public void filePost(String url,File file){
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象。
MediaType fileType = MediaType.parse("File/*");//数据类型为json格式,
RequestBody body = RequestBody.create(fileType , file );
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
client.newCall(request).enqueue(new Callback() {。。。});//此处省略回调方法。
}
5、可以同时带键值对和file对象的post异步请求
public void multipartBody(String url,File file){
OkHttpClient client = new OkHttpClient();
MultipartBody multipartBody =new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("groupId",""+groupId)//添加键值对参数
.addFormDataPart("title","title")
.addFormDataPart("file",file.getName(),RequestBody.create(MediaType.parse("file/*"), file))//添加文件
.build();
final Request request = new Request.Builder()
.url(url)
.post(multipartBody)
.build();
client.newCall(request).enqueue(new Callback() {...});
}
如果对您有用的话赞一下呗!或者评论66!也好啊!谢谢谢谢~