okhttp的第一次使用

时间:2022-04-23 23:20:15
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><pre name="code" class="java">package com.bruce.okhttpdemo;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ImageView;

import java.io.IOException;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okio.BufferedSink;

/**
* compile 'com.squareup.okhttp3:okhttp:3.2.0'
*/
public class MainActivity extends Activity {
ImageView img;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img = (ImageView) findViewById(R.id.img);
getStringByOkHttpGet();
}
/**
* 1-以上就是发送一个get请求的步骤,首先构造一个Request对象,参数最起码有个url,
* 当然你可以通过Request.Builder设置更多的参数比如:header、method等。

2-然后通过request的对象去构造得到一个Call对象,类似于将你的请求封装成了任务,
既然是任务,就会有execute()和cancel()等方法。

3-最后,我们希望以异步的方式去执行请求,所以我们调用的是call.enqueue,将call加入调度队列,
然后等待任务执行完成,我们在Callback中即可得到结果。
*/
/**
* 一个简单的get请求(默认是get请求)
*/
private void getStringByOkHttpGet() {
//创建okHttpClient对象
OkHttpClient mOkHttpClient = new OkHttpClient();
//创建一个Request
final Request request = new Request.Builder()
.url("https://github.com/hongyangAndroid")
.build();
//新建一个请求-- call
Call call = mOkHttpClient.newCall(request);
//然后把这个请求加入调度队列
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.w("onFailure", "" + e.toString());
}

/**
* onResponse回调的参数是response,一般情况下,比如我们希望获得返回的字符串,可以通过response.body().string()获取;
* 如果希望获得返回的二进制字节数组,则调用response.body().bytes();如果你想拿到返回的inputStream,则调用response.body().byteStream()

看到这,你可能会奇怪,竟然还能拿到返回的inputStream,看到这个最起码能意识到一点,这里支持大文件下载,
有inputStream我们就可以通过IO的方式写文件。不过也说明一个问题,这个onResponse执行的线程并不是UI线程。
的确是的,如果你希望操作控件,还是需要使用handler等,
* @param call
* @param response
* @throws IOException
*/
@Override
public void onResponse(Call call, Response response) throws IOException {
//String htmlStr = response.body().string();
Log.w("onResponse", "" + response.body().string());
}
});
}

private void getStringByPost() {
OkHttpClient mOkHttpClient = new OkHttpClient();

RequestBody requestBody = new RequestBody() {
@Override
public MediaType contentType() {
return null;
}

@Override
public void writeTo(BufferedSink sink) throws IOException {

}
};
Request request = new Request.Builder()
.url("www.baidu.com")
.post(requestBody)
.build();
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {

}

@Override
public void onResponse(Call call, Response response) throws IOException {

}
});

}

private static final MediaType MEDIA_TYPE_MARKDOWN
= MediaType.parse("text/x-markdown; charset=utf-8");

private final OkHttpClient client = new OkHttpClient();

public void run() throws Exception {
String postBody = ""
+ "Releases\n"
+ "--------\n"
+ "\n"
+ " * _1.0_ May 6, 2013\n"
+ " * _1.1_ June 15, 2013\n"
+ " * _1.2_ August 11, 2013\n";

Request request = new Request.Builder()
.url("https://api.github.com/markdown/raw")
.post(RequestBody.create(MEDIA_TYPE_MARKDOWN, postBody))
.build();

Response response = client.newCall(request).execute();
if (!response.isSuccessful())
throw new IOException("Unexpected code " + response);

System.out.println(response.body().string());
}

public static final MediaType JSON
= MediaType.parse("application/json; charset=utf-8");

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();
return response.body().string();
}
}

张鸿阳博客

官方文档