标签:addclass addheader author builder cli 首页 world 状态 查询
public class SyncGet {
public static void main(String[] args) throws IOException {
//1.首先创建一个 OkHttpClient 类的对象,该对象是使用 OkHttp 的入口
OkHttpClient client = new OkHttpClient();
/* 2.接着要创建的是表示 HTTP 请求的 Request 对象。通过 Request.Builder 这个构建帮助类可以快速的创建出 Request 对象。这里指定了 Request 的 url 为 http://www.baidu.com */
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
//OkHttp 使用调用(Call)来对发送 HTTP 请求和获取响应的过程进行抽象
/*接着通过 OkHttpClient 的 newCall 方法来从 Request 对象中创建一个 Call 对象,再调用 execute 方法来执行该调用,所得到的结果是表示 HTTP 响应的 Response 对象。*/
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
throw new IOException("服务器端错误: " + response);
}
/*通过 Response 对象中的不同方法可以访问响应的不同内容。如 headers 方法来获取 HTTP 头,body 方法来获取到表示响应主体内容的 ResponseBody 对象。*/
Headers responseHeaders = response.headers();
for (int i = 0; i < responseHeaders.size(); i++) {
System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
}
System.out.println(response.body().string());
}
}
public class Headers {
public static void main(String[] args) throws IOException {
OkHttpClient client = new OkHttpClient();
//使用 header 方法设置了 User-Agent 头的值,并添加了一个 Accept 头的值。
Request request = new Request.Builder()
.url("http://www.baidu.com")
.header("User-Agent", "My super agent")
.addHeader("Accept", "text/html")
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
throw new IOException("服务器端错误: " + response);
}
/*2.在进行解析时,通过 header 方法来获取 Server 头的单个值,通过 headers 方法来获取 Set-Cookie 头的所有值。*/
System.out.println(response.header("Server"));
System.out.println(response.headers("Set-Cookie"));
}
}
//以 String 类型提交内容只适用于内容比较小的情况
public class PostString {
public static void main(String[] args) throws IOException {
OkHttpClient client = new OkHttpClient();
MediaType MEDIA_TYPE_TEXT = MediaType.parse("text/plain");
String postBody = "Hello World";
/*HTTP POST 和 PUT 请求可以包含要提交的内容。只需要在创建 Request 对象时,通过 post 和 put 方法来指定要提交的内容即可*/
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(RequestBody.create(MEDIA_TYPE_TEXT, postBody))
.build();
//中通过 RequestBody 的 create 方法来创建媒体类型为 text/plain 的内容并提交。
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
throw new IOException("服务器端错误: " + response);
}
System.out.println(response.body().string());
}
}
2) 当请求内容较大时,应该使用流来提交。
public class PostStream {
public static void main(String[] args) throws IOException {
OkHttpClient client = new OkHttpClient();
final MediaType MEDIA_TYPE_TEXT = MediaType.parse("text/plain");
final String postBody = "Hello World";
/*使用流方式来提交内容,创建了 RequestBody 的一个匿名子类。该子类的 contentType 方法需要返回内容的媒体类型,而 writeTo 方法的参数是一个 BufferedSink 对象。我们需要做的就是把请求的内容写入到 BufferedSink 对象即可。*/
RequestBody requestBody = new RequestBody() {
@Override
public MediaType contentType() {
return MEDIA_TYPE_TEXT;
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
sink.writeUtf8(postBody);
}
@Override
public long contentLength() throws IOException {
return postBody.length();
}
};
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(requestBody)
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
throw new IOException("服务器端错误: " + response);
}
System.out.println(response.body().string());
}
}
3) 文件类型:如果所要提交的内容来自本地文件,则不需要额外的流操作,只需要通过 RequestBody 的 create 方法,并把 File 类型的对象作为参数传入即可。
4) HTML表单类型:如果需要模拟 HTML 中的表单提交,可以通过 FormEncodingBuilder 来创建请求内容.
RequestBody formBody = new FormEncodingBuilder()
.add("query", "Hello")
.build();
5) HTML文件上传类型:如果需要模拟 HTML 中的文件上传功能,可以通过 MultipartBuilder 来创建 multipart 请求内容。
MediaType MEDIA_TYPE_TEXT = MediaType.parse("text/plain");
//multipart 请求添加了一个表单属性 title 和一个文件 file。
RequestBody requestBody = new MultipartBuilder()
.type(MultipartBuilder.FORM)
.addPart(
Headers.of("Content-Disposition", "form-data; name=\"title\""),
RequestBody.create(null, "测试文档"))
.addPart(
Headers.of("Content-Disposition", "form-data; name=\"file\""),
RequestBody.create(MEDIA_TYPE_TEXT, new File("input.txt")))
.build();
6)文件上传示例二:
File file = new File(Environment.getExternalStorageDirectory(), "balabala.mp4");
RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
RequestBody requestBody = new MultipartBuilder()
.type(MultipartBuilder.FORM)
.addPart(Headers.of(
"Content-Disposition",
"form-data; name=\"username\""),
RequestBody.create(null, "张鸿洋"))
.addPart(Headers.of(
"Content-Disposition",
"form-data; name=\"mFile\";
filename=\"wjd.mp4\""), fileBody)
.build();
Request request = new Request.Builder()
.url("http://192.168.1.103:8080/okHttpServer/fileUpload")
.post(requestBody)
.build();
Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback()
{
//...
});
public class CacheResponse {
public static void main(String[] args) throws IOException {
int cacheSize = 100 * 1024 * 1024;
File cacheDirectory = Files.createTempDirectory("cache").toFile();
Cache cache = new Cache(cacheDirectory, cacheSize);
OkHttpClient client = new OkHttpClient();
//创建出 Cache 对象之后,通过 OkHttpClient 的 setCache 进行设置。
client.setCache(cache);
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {
throw new IOException("服务器端错误: " + response);
}
/*通过 Response 对象的 cacheResponse 和 networkResponse 方法可以得到缓存的响应和从实际的 HTTP 请求得到的响应。*/
System.out.println(response.cacheResponse());
/*如果该请求的响应来自实际的网络请求,则 cacheResponse 方法的返回值为 null;如果响应来自缓存,则 networkResponse 的返回值为 null。OkHttp 在进行缓存时会遵循 HTTP 协议的要求,因此可以通过标准的 HTTP 头 Cache-Control 来控制响应的缓存时间。*/
System.out.println(response.networkResponse());
}
}
OkHttpClient client = new OkHttpClient();
client.setAuthenticator(new Authenticator() {
//新的 Request 对象中添加了 HTTP 基本认证的 Authorization 头。
public Request authenticate(Proxy proxy, Response response) throws IOException {
String credential = Credentials.basic("user", "password");
return response.request().newBuilder()
.header("Authorization", credential)
.build();
}
public Request authenticateProxy(Proxy proxy, Response response)
throws IOException {
return null;
}
});
public class AsyncGet {
public static void main(String[] args) throws IOException {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
/*在通过 newCall 方法创建一个新的 Call 对象之后,不是通过 execute 方法来同步执行,而是通过 enqueue 方法来添加到执行队列中。在调用 enqueue 方法时需要提供一个 Callback 接口的实现。在 Callback 接口实现中,通过 onResponse 和 onFailure 方法来处理响应和进行错误处理*/
client.newCall(request).enqueue(new Callback() {
public void onFailure(Request request, IOException e) {
e.printStackTrace();
}
public void onResponse(Response response) throws IOException {
if (!response.isSuccessful()) {
throw new IOException("服务器端错误: " + response);
}
System.out.println(response.body().string());
}
});
}
}
public class CancelRequest {
private OkHttpClient client = new OkHttpClient();
//所有请求都设置了标签 website,可以通过 cancel 方法来全部取消。
private String tag = "website";
public void sendAndCancel() {
sendRequests(Lists.newArrayList(
"http://www.baidu.com",
"http://www.163.com",
"http://www.sina.com.cn"));
client.cancel(this.tag);
}
public void sendRequests(List<String> urls) {
urls.forEach(url -> {
client.newCall(new Request.Builder()
.url(url)
.tag(this.tag)
.build())
.enqueue(new SimpleCallback());
});
}
private static class SimpleCallback implements Callback {
public void onFailure(Request request, IOException e) {
e.printStackTrace();
}
public void onResponse(Response response) throws IOException {
System.out.println(response.body().string());
}
}
public static void main(String[] args) throws IOException {
new CancelRequest().sendAndCancel();
}
}
//拦截器 LoggingInterceptor 用来记录 HTTP 请求和响应的相关信
public class LoggingInterceptor implements Interceptor {
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
long t1 = System.nanoTime();
System.out.println(String.format("发送请求: [%s] %s%n%s",
request.url(), chain.connection(), request.headers()));
/*
Interceptor 接口只包含一个方法 intercept,其参数是 Chain 对象。Chain 对象表示的是当前的拦截器链条。通过 Chain 的 request 方法可以获取到当前的 Request 对象。在使用完 Request 对象之后,通过 Chain 对象的 proceed 方法来继续拦截器链条的执行。当执行完成之后,可以对得到的 Response 对象进行额外的处理。*/
Response response = chain.proceed(request);
long t2 = System.nanoTime();
System.out.println(String.format("接收响应: [%s] %.1fms%n%s",
response.request().url(), (t2 - t1) / 1e6d, response.headers()));
return response;
}
}
client.interceptors().add(new LoggingInterceptor()); //添加应用拦截器
client.networkInterceptors().add(new LoggingInterceptor()); //添加网络拦截器
OkHttp 中的拦截器分成应用和网络拦截器两种:
1) 应用拦截器对于每个 HTTP 响应都只会调用一次,可以通过不调用 Chain.proceed 方法来终止请求,也可以通过多次调用 Chain.proceed 方法来进行重试。
2) 网络拦截器对于调用执行中的自动重定向和重试所产生的响应也会被调用,而如果响应来自缓存,则不会被调用。
https://www.ibm.com/developerworks/cn/java/j-lo-okhttp/
http://square.github.io/okhttp/
https://github.com/square/okhttp
http://blog.csdn.net/lmj623565791/article/details/47911083
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0106/2275.html
http://blog.csdn.net/Jerry_1911/article/details/50467542
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0106/2275.html
https://github.com/hongyangAndroid/okhttp-utils
标签:addclass addheader author builder cli 首页 world 状态 查询
原文地址:http://blog.csdn.net/fumin466566941/article/details/52892462