第一次写这种技术类文章,感觉有点神奇。先写下自己现在的一些理解,然后有什么需要改进的以后再来修改。
OkHttp依赖
首先在使用OkHttp之前,需要app/build.gradle中添加OkHttp库的依赖。
compile 'com.squareup.okhttp3:okhttp:3.4.1'
通过其会自动下载两个库,一个是OkHttp库,一个是Okio库,后者是前者的通信基础。
OkHttpClient
创建一个OkHttpClient,用于所有的HTTP请求。源码注释上说,OkHttpClient最好是使用singleton模式进行创建,这样可以复用线程和连接,具体的话后面再继续分析。创建的话可以直接新建对象或者用Builder来进行创建,直接贴源码的例子了。
// The singleton HTTP client.
public final OkHttpClient client = new OkHttpClient();
//The singleton HTTP client.
public final OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new HttpLoggingInterceptor()).cache(new Cache(cacheDir, cacheSize)).build()
Request
如果要发送HTTP请求的话,还需要创建一个Request对象。如果要用GET的方式进行网络请求的话,直接生成Request对象即可。
Request request = new Request.Builder().url(address).build();
如果是要用POST方式进行网络请求的话,还需要先创建一个RequestBody对象,在其中存放想要提交的参数。
Request.Builder requestBuilder = new Request.Builder();
requestBuilder.url(address).post(requestBody);
Request request = requestBuilder.build();
RequestBody有两个子类,FormBody和MultipartBody,下面逐一分析:
RequestBody
RequestBody是一个抽象类,但是在它的create方法中对其进行匿名实现,create方法有两个形参,一个是请求数据类型MediaType,另一个是请求数据。RequestBody中对create方法进行重载使得它支持String,ByteString,byte[],File这些作为请求数据的形参,其实内部最后都是转为Byte流。
public static final MediaType JSON= MediaType.parse("application/json; charset=utf-8");
JSONObject JSONpara = new JSONObject();
JSONpara.put("account",account);
String content = String.valueOf(JSONpara);
RequestBody requestBody = RequestBody.create(JSON,content);
FormBody
FormBody继承了RequestBody,主要是按照浏览器原生的<form>表单,以application/x-www-form-urlencoded 方式提交数据。
<form action="form_action.asp" enctype="text/plain">
<p>First name: <input type="text" name="fname" /></p>
<p>Last name: <input type="text" name="lname" /></p>
<input type="submit" value="Submit" />
</form>
我们先获得FormBody的Builder,用add去添加对应的name跟value,最后调用build()方法获得最终的FormBody对象。
RequestBody requestBody = new FormBody.Builder().add("username","admin").add("pasword","123456").build();
MultipartBody
当我们传输的内容中,可能既有字符串,又有图片这种多种类型的数据的时候,就要用到MultipartBody了。在MultipartBody里面定义了一个part类,里面包含了Headers实例跟RequestBody实例,我们传进去的每一项数据都会转为一个part对象存储在一个List中,最后得到的MultipartBody中包含了这个List。源码的东西等有空再来分析。
public static final MediaType JSON= MediaType.parse("application/json; charset=utf-8");
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
JSONObject JSONpara = new JSONObject();
JSONpara.put("account",account);
String content = String.valueOf(JSONpara);
File file = new File(targetPath);
MultipartBody.Builder mbody = new MultipartBody.Builder().setType(MultipartBody.FORM);
mbody.addFormDataPart("test",null,RequestBody.create(JSON,Content));
mbody.addFormDataPart("upload",file.getName(), RequestBody.create(MEDIA_TYPE_PNG,file));
RequestBody requestBody = mbody.build();
当生成了Request之后,通过调用OkHttpClient中的newCall(Request request)方法就可以得到一个Call对象了,接下来只需调用Call里面的请求方法就可以发出请求并获取到结果了。Call中定义了同步请求和异步请求两种方式来进行实现。
同步请求execute()
如果采用同步请求,我们直接在当前线程上实现网络请求,并获得相应的response结果。如果要进行同步请求的话切记不能在UI线程中执行。
Response response = client.newCall(request).execute();
String body = response.body().string();
异步请求enqueue(Callback callback)
如果要采用异步请求的话,会在线程池中执行网络请求,当请求成功时调用callback中的onReponse()方法,当失败时调用callback中的onFailure()方法。callback需要我们自己实现,其中的onReponse()和onFailure()也需要我们去Override。一般情况下都是采用异步请求去执行。
client.newCall(request).enqueue(new Callback() {
//获取信息失败
@Override
public void onFailure(Call call, IOException e) {
Log.d(TAG,"Failed");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//获取消息成功
if(response.isSuccessful())
{
String responseData = response.body().string();
Log.d(TAG, responseData);
}
//获取信息失败
else
{
Log.d(TAG, "Failed");
}
}
);
关于OkHttp的基本使用就讲到这里了。接下来有空的话把OkHttp中各种请求的方法之类的都总结一遍。这一篇的内容就暂时先这样吧。