目录
OkHttp是一个优秀的网络请求框架
一、OkHttp进行Get请求
1、使用步骤
1)添加依赖
dependencies {
......
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
}
2)新建一个OkHttpClient实例
OkHttpClient client = new OkHttpClient();
3)构造Request对象
Request request = new Request.Builder()
.get()//默认就是GET请求,可以不写
.url(url)//设置请求网址
.build();
4)构建Call对象
Call call = client.newCall(request);
5)根据需要调用同步或者异步请求方式
同步一定要在子线程操作(new Thread)
异步可以在主线程操作。
- 同步
同步方式会阻塞调用线程,所以在Android中应放在子线程中执行。
new Thread(new Runnable() {
@Override
public void run() {
try {
Response response = call.execute();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
- 异步
异步调用的回调函数是在子线程,不能在子线程更新UI,需要借助于runOnUiThread()方法或者Handler来处理。
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
final String str = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
......
}
});
}
});
Response:结果响应。
- 获得返回的字符串,通过response.body().string()
- 获得返回的二进制字节数组,通过response.body().bytes()
- 获得返回的inputStream,通过response.body().byteStream()
2、同步Get请求bitmap
public class MainActivity extends AppCompatActivity {
private ImageView responseview;
private String url = "https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=2239146502,165013516&fm=27&gp=0.jpg";
private Handler handler = new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
Bitmap bitmap = (Bitmap) msg.obj;
responseview.setImageBitmap(bitmap);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
responseview = findViewById(R.id.response_view);
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.get()//默认就是GET请求,可以不写
.url(url)//设置请求网址
.build();
final Call call = client.newCall(request);
new Thread(new Runnable() {
@Override
public void run() {
try {
Response response = call.execute();
InputStream is = response.body().byteStream();
Bitmap bitmap = BitmapFactory.decodeStream(is);
Message message = handler.obtainMessage();
message.obj = bitmap;
handler.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
3、异步Get请求String
public class MainActivity extends AppCompatActivity {
private TextView responseview;
private String url = "https://www.baidu.com/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
responseview = findViewById(R.id.response_view);
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.get()//默认就是GET请求,可以不写
.url(url)//设置请求网址
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
final String str = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
responseview.setText(str);
}
});
}
});
}
}
二、OkHttp进行Post请求
1、使用步骤
1)添加依赖
dependencies {
......
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
}
2)新建一个OkHttpClient实例
OkHttpClient client = new OkHttpClient();
3)构造RequestBody或FormBody
FormBody formBody = new FormBody.Builder()
.add("username", "...")//提交到服务器的键值对
.add("password", "...")
.build();
FormBody是RequestBody的子类
一般请求提交键值对使用FormBody
MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");
RequestBody requestBody = RequestBody.create("123", mediaType);
4)构造Request对象
Request request = new Request.Builder()
.post(formBody)
.url(url)//设置请求网址
.build();