博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OkHttp3学习(一):基本使用
阅读量:5869 次
发布时间:2019-06-19

本文共 5590 字,大约阅读时间需要 18 分钟。

An HTTP & HTTP/2 client for Android and Java applications

引用自

什么都不管,先上个代码。敲完再说。

GET

OkHttpClient client = new OkHttpClient();        Request request = new Request.Builder()                .get()                .url(PATH)                .build();        client.newCall(request).enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) throws IOException {                if (response.isSuccessful()) {                    String string = response.body().string();                    Log.i(TAG, "onResponse: "+string);                }            }        });

clipboard.png

上面的图中显示了response.body()可以得到的数据类型。在上面的例子中我们使用了string()来得到了相应的字符串数据。

需要注意的是这里的回调不在主线程.如果需要更新UI。我们还需要切换到主线程进行操作。

POST

这是一个异步调用的例子。

MediaType jsonType = MediaType.parse("application/json; charset=utf-8");        OkHttpClient client = new OkHttpClient();        String jsonStr = new Gson().toJson(mPerson);        RequestBody body = RequestBody.create(jsonType,jsonStr);        Request request = new Request.Builder()                .post(body)                .url(PATH)                .build();        client.newCall(request).enqueue(new Callback() {           @Override           public void onFailure(Call call, IOException e) {           }           @Override           public void onResponse(Call call, Response response) throws IOException {               if (response.isSuccessful()){                   String string = response.body().string();                   Log.i(TAG, "post: "+string);               }           }        });

请求大致过程

我们每次做请求的时候都要有一个OkHttpClient实体,用来构建我们的一次请求。而Request类用来设置我们请求需要的参数,之后我们就可以通过client来发送一个请求了。在上面的例子中,我们将请求加入到了一个请求队列中(enqueue)。最后我们就得到了这次请求的响应response了。

Request

在构建Request的时候,使用到了Builder设计模式。只需要简单的链式调用配置好请求参数。如下:

Request request = new Request.Builder().url(PATH)                .header("User-Agent", "my-agent")                .addHeader("Accept-Language", "zh-cn")                .get()                .build();

header && addHeader

headeraddHeader用来添加头部字段的key-value对。

/**     * Sets the header named {@code name} to {@code value}. If this request already has any headers     * with that name, they are all replaced.     */    public Builder header(String name, String value) {      headers.set(name, value);      return this;    }    /**     * Adds a header with {@code name} and {@code value}. Prefer this method for multiply-valued     * headers like "Cookie".     *     * 

Note that for some headers including {@code Content-Length} and {@code Content-Encoding}, * OkHttp may replace {@code value} with a header derived from the request body. */ public Builder addHeader(String name, String value) { headers.add(name, value); return this; }

我们看到,这两个函数底层一个是使用的Header.Builderset(),一个是使用的add().在继续往里看:

/**     * Set a field with the specified value. If the field is not found, it is added. If the field is     * found, the existing values are replaced.     */    public Builder set(String name, String value) {      checkNameAndValue(name, value);      removeAll(name);      addLenient(name, value);      return this;    }          /** Add a field with the specified value. */    public Builder add(String name, String value) {      checkNameAndValue(name, value);      return addLenient(name, value);    }

这就很清晰了。很明显了。set()调用了removeAll(key)方法来删除之前设置了同名的key。而add并没有删除。其实从名字我们就可以看出来。add就是添加嘛。set设置,肯定只有一个嘛。

RequestBody

OkHttpClient client =new OkHttpClient();        MediaType parse = MediaType.parse("application/json; charset=utf-8");        RequestBody body = RequestBody.create(parse,new Gson().toJson(mPerson));        Request request = new Request.Builder().url(PATH)                .header("User-Agent", "my-agent")                .addHeader("Accept-Language", "zh-cn")                .post(body)                .build();        client.newCall(request).enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {            }            @Override            public void onResponse(Call call, Response response) throws IOException {            }        });

将上面的请求通过抓包工具抓取后,下图即为本次的请求。

clipboard.png

ResponseBody是一个抽象类。在okhttp中的子类有FormBodyMultipartBody。 我们可以通过静态方法create来构建一个ResponseBody

clipboard.png

ResponseBody内部的create可以通过三中方式构建。当然了。我们也可以模仿官方的crete方法来构建自己的

ResponseBody来上传制定类型的文件。
我们通过MediaType来指定我们上传文件的类型。比如上面代码中的"application/json; charset=utf-8"就是我们上传的内容的类型。
当我们有什么文件想要提交,但是不知道key是什么的时候可以看MIME 参考手册

FormBody

用来提交一些表单数据。通过FormBody.Builder来添加表单数据。如下所示:

OkHttpClient client = new OkHttpClient();        FormBody formBody = new FormBody.Builder()                .add("username", "jason")                .add("password", "magicer")                .build();        Request request = new Request.Builder()                .post(formBody)                .addHeader("User-Agent", "Apple")                .build();        Response response = client.newCall(request).execute();

FromBody中,查看其源码我们可以看到FormBody设置的Content-Type"application/x-www-form-urlencoded".也就是普通表单数据。

private static final MediaType CONTENT_TYPE =      MediaType.parse("application/x-www-form-urlencoded");

MultipartBody

以下是MultipartBody中的一些个类型。

public static final MediaType MIXED = MediaType.parse("multipart/mixed");public static final MediaType ALTERNATIVE = MediaType.parse("multipart/alternative");public static final MediaType DIGEST = MediaType.parse("multipart/digest");public static final MediaType PARALLEL = MediaType.parse("multipart/parallel");public static final MediaType FORM = MediaType.parse("multipart/form-data");

转载地址:http://saxnx.baihongyu.com/

你可能感兴趣的文章
Exchange Server 2016 独立部署/共存部署 (七)—— DAG功能测试
查看>>
Linux 进程中 Stop, Park, Freeze【转】
查看>>
Spark修炼之道(基础篇)——Linux大数据开发基础:第九节:Shell编程入门(一)...
查看>>
Duplicate Symbol链接错误的原因总结和解决方法[转]
查看>>
适配器模式
查看>>
建立低权限的ftp帐号
查看>>
htpasswd
查看>>
微软整合实验(七):布署Exchange2010 Mailbox高可用(DAG)
查看>>
spring定时器----JobDetailBean
查看>>
我的友情链接
查看>>
XP下如何删除附件中的游戏组件
查看>>
我的友情链接
查看>>
emma的几个不足之处
查看>>
Java工具类——UUIDUtils
查看>>
使用Node搭建reactSSR服务端渲染架构
查看>>
文件缓存
查看>>
转 博弈类题目小结(hdu,poj,zoj)
查看>>
Java NIO学习笔记八 Pipe
查看>>
远程协助
查看>>
Scrum实施日记 - 一切从零开始
查看>>