okhttp 是优秀的开源库,学习使用。
square官方地址 : https://square.github.io/okhttp/?FbmNv=5d457a706647bd08
github地址 : https://github.com/square/okhttp
1.添加依赖
在 app 的 build.gradle 下添加
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
2. get操作
新开线程使用
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象
Request request = new Request.Builder()
.url(ADDRESS_NETTV)//请求接口。如果需要传参拼接到接口后面。
.build();//创建Request 对象
Response response = null;
response = client.newCall(request).execute();//得到Response 对象
if (response.isSuccessful()) {
//此时的代码执行在子线程,修改UI的操作请使用handler跳转到UI线程。
Log.d("luoah", "[MainActivity.java] -- getDataSync -- response.code():" + response.code());
Log.d("luoah", "[MainActivity.java] -- getDataSync -- response.protocol():" + response.protocol());
Log.d("luoah", "[MainActivity.java] -- getDataSync -- response.message():" + response.message());
Log.d("luoah", "[MainActivity.java] -- getDataSync -- response.body().string():" + response.body().string());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
异步操作
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d("luoah", "[MainActivity.java] -- onFailure -- e.getMessage():" + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {//回调的方法执行在子线程。
String str = response.body().string();
Log.d("luoah", "[MainActivity.java] -- onResponse -- str:" + str);
}
}
});
3. post操作
用 FormBody 传递键值对参数
kHttpClient client = new OkHttpClient();
FormBody formBody = new FormBody
.Builder()
.add("lah", "123123")//传递键值对
.build();
Request request = new Request
.Builder()
.url(ADDRESS_JIANSHU)
.post(formBody)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
用 RequestBody 传递 Json
OkHttpClient client = new OkHttpClient();
//RequestBody中的MediaType指定为纯文本,编码方式是utf-8
MediaType mediaType = MediaType.parse("text/plain;charset=utf-8\"");
String jsonStr = "{\"username\":\"lah\",\"userpassword\":\"123123\"}";//json数据.
RequestBody requestBody = RequestBody.create(mediaType, jsonStr);
Request request = new Request
.Builder()
.url(ADDRESS_BAIDU)
.post(requestBody)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
用 RequestBody 传递 File
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");
File file = new File("README.md");
Request request = new Request
.Builder()
.url("https://api.github.com/markdown/raw")
.post(RequestBody.create(mediaType, file))
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String responseStr = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
//refresh UI
}
});
}
});
用 MultipartBody 同时传递 键值对参数 和 File 对象
//1.创建OkHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
//上传的图片
File file = new File(Environment.getExternalStorageDirectory(), "zhuangqilu.png");
//2.通过new MultipartBody build() 创建requestBody对象,
RequestBody requestBody = new MultipartBody.Builder()
//设置类型是表单
.setType(MultipartBody.FORM)
//添加数据
.addFormDataPart("username","lll")
.addFormDataPart("age","25")
.addFormDataPart("image","haha.png",
RequestBody.create(MediaType.parse("image/png"), file))
.build();
//3.创建Request对象,设置URL地址,将RequestBody作为post方法的参数传入
Request request = new Request
.Builder()
.url(ADDRESS_JIANSHU)
.post(requestBody)
.build();
//4.创建一个call对象,参数就是Request请求对象
Call call = okHttpClient.newCall(request);
//5.请求加入调度,重写回调方法
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});