Android之OkHttp框架(一)--基本用法

第一次写这种技术类文章,感觉有点神奇。先写下自己现在的一些理解,然后有什么需要改进的以后再来修改。


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中各种请求的方法之类的都总结一遍。这一篇的内容就暂时先这样吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值