OkHttp详细用法
来源:互联网 发布:avtt天堂2015最新域名 编辑:程序博客网 时间:2024/05/21 03:24
引入依赖
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>3.1.0</version></dependency>
发起GET请求
首先,根据url和参数构建get请求的完整url:
private String builderGetUrl(String url, Map<String, String> params) { StringBuilder result = new StringBuilder(url); int index = url.lastIndexOf("?"); if (index == -1) { result.append("?"); } for (Map.Entry<String, String> entry : params.entrySet()) { result.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } if (!params.isEmpty()) { result.deleteCharAt(result.length() - 1); } return result.toString();}
其次,发起GET请求,
OkHttpClient client = new OkHttpClient.Builder().build();Request.Builder requestBuilder = new Request.Builder();requestBuilder.addHeader("Cookie", "P00004=XXXXXX"); // 添加请求头Map<String, String> params = Maps.newHashMap();params.put("vid", "0749112147010284");params.put("options", "{\"0811385077020277\":[\"0966478616030212\"]}");Request request = requestBuilder.url(builderGetUrl(voteUrl, params)).get().build(); // .get()可有可无Response response = client.newCall(request).execute();// 或者异步获取返回结果:client.newCall(request).enqueue( new Callback() { @Override public void onFailure(Call call, IOException e) { queue.add(e.getMessage()); } @Override public void onResponse(Call call, Response response) throws IOException { String responseBody = response.body().string(); System.out.println(responseBody); } });
POST请求
要发送post请求一定要有RequestBody,RequestBody可以使用FormBody、MultipartBody或者RequestBody的各种create()工厂方法来创建,
OkHttpClient client = new OkHttpClient().Builder().build();MediaType JSON = MediaType.parse("application/json; charset=utf-8");String json = "{\"0811385077020277\":[\"0966478616030212\"]}";RequestBody body = RequestBody.create(JSON, json);// 或者使用对象构建RequestBodyRequestBody body = new RequestBody() { @Override public void writeTo(BufferedSink sink) throws IOException { sink.write(buildRequest().toByteArray()); // buildRequest()返回一个自己构造的对象,转为字节直接存放在request body里面 } @Override public MediaType contentType() { return MediaType.parse("application/x-protobuf"); }};Request request = new Request.Builder() .url(url) .post(body) .build();Response response = client.newCall(request).execute();
构建RequestBody
RequestBody是一个抽象类,其中有很多create()工具方法可以直接创建出一个RequestBody。同时也可以自己实现writeTo()方法和contentType()方法来构造RequestBody:
RequestBody body = new RequestBody() { @Override public void writeTo(BufferedSink sink) throws IOException { sink.write(buildRequest().toByteArray()); // buildRequest()返回一个自己构造的对象,转为字节直接存放在request body里面 } @Override public MediaType contentType() { return MediaType.parse("application/x-protobuf"); }};
FormBody
FormBody是RequestBody的一种实现。要想post请求像网页一样提交一个form表单,则需要用到FormBody。
FormBody body = new FormBody.Builder() .add("name", "value") .addEncoded("name", "value") .build();
MultipartBody
总所周知,如果需要在网页表单上提交一个文件,需要把表单设置为”multipart/form-data”。在OkHttp中则需要使用到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");
其次,构建MultipartBody,
MultipartBody body = new MultipartBody.Builder() .addFormDataPart("name", "value") .addFormDataPart( "name", "filetest", RequestBody.create( MediaType.parse("application/json"), new File( "C:\\Users\\yorkchen\\Desktop\\voteUrl.txt"))) .addPart( Headers.of("Content-Disposition", "form-data; name=\"title\""), RequestBody.create(null, "Square Logo")).build();System.out.println(body);for (Part part : body.parts()) { try { Class<?> cl = part.getClass(); Field headersField = cl.getDeclaredField("headers"); Field bodyField = cl.getDeclaredField("body"); headersField.setAccessible(true); bodyField.setAccessible(true); System.out.println(((Headers) headersField.get(part))); System.out.println(((RequestBody) bodyField.get(part))); } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { e.printStackTrace(); }}/** * output: * okhttp3.MultipartBody@366e2eef * Content-Disposition: form-data; name="name" * * okhttp3.RequestBody$2@3cbbc1e0 * Content-Disposition: form-data; name="name"; filename="filetest" * * okhttp3.RequestBody$3@35fb3008 * Content-Disposition: form-data; name="title" * * okhttp3.RequestBody$2@7225790e */
最后,再看一个RequestBody示例,
喜欢的可以关注微信公众号:
参考
- 我自己的头条号:开发技术专注者
0 0
- OkHttp详细用法
- OkHttp用法
- okhttp用法
- OkHttp用法
- OkHttp详细使用
- OkHttp 的详细介绍
- Android OkHttp详细介绍
- Android OkHttp基本用法
- okHttp的用法
- OKhttp的用法
- OkHttp简单用法
- OKHttp的简单用法
- OkHttp简单用法
- okhttp的post用法
- OkHttp基本用法
- okhttp-utils 用法介绍
- OkHttp 用法解析
- 关于OkHttp的用法
- 《图解网络硬件》学习笔记。
- SQL经典讲解之配置SQL Server服务器属性
- 获取上下文信息的方法
- Reshape the Matrix问题及解法
- 第八周 JavaScript初学
- OkHttp详细用法
- POJ 1847 Tram Floyd或者spfa 最短路
- Linux--内存管理
- springmvc 想到哪里写到哪里
- 练习题 No.22 单源最短路问题(Bellman-Ford算法)
- input 只允许输入数字
- java——转换流
- LeetCode 题解(Week 11):Word Break
- python之numpy学习