简介
OKHttp是Square公司的一个网络请求框架。
使用前的准备工作:
学习:地址
添加依赖:
implementation 'com.squareup.okhttp3:okhttp:version'
添加权限:
<uses-permission android:name="android.permission.INTERNET"/>
OkHttp进行Get请求
1、拿到OkHttpClient对象
2、构造Request对象
3、将Request封装为Call
4、根据需要调用同步或者异步请求方法
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder()
.get()
.url("www.baidu.com")
.build();
Call call = okHttpClient.newCall(request);
//同步请求 返回response,会抛出IO异常须try catch【同步调用会阻塞主线程,一般不使用】
try {
Response response = call.execute();
} catch (IOException e) {
e.printStackTrace();
}
//异步调用,并设置回调函数【回调函数在子线程,须注意回到主线程更新ui】
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
runOnUiThread(() -> {
//更新ui
});
}
});
OkHttp进行Post请求提交键值对
使用OkHttp进行Post请求和进行Get请求很类似,只需要五步即可完成:
1、拿到OkHttpClient对象
2、构建FormBody,传入参数
3、构建Request,将FormBody作为Post方法的参数传入
4、将Request封装为Call
5、调用请求,重写回调方法。(同步或者异步请求方法)
OkHttpClient okHttpClient = new OkHttpClient();
FormBody formBody=new FormBody.Builder()
.add("username", "admin")
.add("password", "root")
.build();
Request request=new Request.Builder()
.url("http://www.jianshu.com/")
.post(formBody)
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d("onResponse", "onResponse: "+response.code());
}
});
OkHttp进行Post请求提交字符串
post的参数是通过构造一个FormBody通过键值对的方式来添加进去的,其实post方法需要传入的是一个RequestBody对象,FormBody是RequestBody的子类,但有时候我们常常会遇到要传入一个字符串的需求,比如客户端给服务器发送一个json字符串,那这种时候就需要用到另一种方式来构造一个RequestBody
RequestBody requestBody = RequestBody
.create(MediaType.parse("text/plain;charset=utf-8"), "{username:admin;password:admin}");
OkHttp进行Post请求提交表单
注意事项
1、添加okio依赖
2、在AndroidManifest.xml文件中添加存储卡读写权限
3、如果提交的是表单,一定要设置setType(MultipartBody.FORM)这一句
4、提交的文件addFormDataPart()的第二个参数文件的本地的名字,第三个参数是RequestBody,里面包含了我们要上传的文件的路径以及MidiaType
File file = new File(Environment.getExternalStorageDirectory(), "1.png");
if (!file.exists()){
Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
return;
}
RequestBody muiltipartBody = new MultipartBody.Builder()
//一定要设置这句
.setType(MultipartBody.FORM)
.addFormDataPart("username", "admin")//
.addFormDataPart("password", "admin")//
.addFormDataPart("myfile", "1.png",
RequestBody.create(MediaType.parse("application/octet-stream"), file))
.build();
…