1、android 原生的访问api有2个:
HttpUrlConnection和HttpClient,它们对封装Socket进行封装,让HTTP请求变得简单。
分析:socket是java底层的通信方式,使用的协议是tcp/ip.
而httpclient是模拟(或者说使用)我们日常使用的http协议,也就是说httpclient直接使用的http协议.
而tcp/ip协议是http协议的底层实现.
也就是说http协议要转换成tcp/ip协议.
从java的角度来说,就是httpclient间接的使用了socket来通信.
httpclient—http—socket(java底层通信)—tcp/ip
socket通信是基于 tcp 或者udp 2种方式,通常来说都是基于tcp协议的。
1 httpclient
HttpClient 是 Apache Jakarta Common 下的子项目
导包:
commons-httpclient-版本号.jar
Apache HttpClient早就不推荐httpclient,5.0之后干脆废弃,后续会删除。6.0删除了HttpClient。Java开发用HttpClient,官方推荐Android开发用HttpUrlConnection。
2 httpurlconnection
Google自带的,JDK里面自带的URLConnection
不过在Android 2.2版本之前,HttpURLConnection一直存在着一些令人厌烦的bug。比如说对一个可读的InputStream调用close()方法时,就有可能会导致连接池失效了。
在android 2.2及以下版本中HttpUrlConnection存在着一些bug,所以建议在android 2.3以后使用HttpUrlConnection,2.3之前使用HttpClient。
如果你看过Volley的源代码,就知道
当
SDK>9时,默认使用HttpUrlConnection,
<9的就用HttpClient。
volley其实是集成这2中方法,进行封装。
说明这2中方法都存在缺点,现在又出来一种请求方式:
OkHttp
下载:
https://square.github.io/okhttp/
导包:
http://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/3.2.0/okhttp-3.2.0.jar
尽管Google在大部分安卓版本中推荐使用HttpURLConnection,但是这个类相比HttpClient实在是太难用,太弱爆了。
OkHttp是一个相对成熟的解决方案,据说Android4.4的源码中可以看到HttpURLConnection已经替换成OkHttp实现了。所以我们更有理由相信OkHttp的强大。
OkHttp额外提供HttpUrlConnection和HttpClient的写法。你只需要再依赖okhttp-urlconnection.jar或者okhttp-apache.jar就可以了。
OkHttp 是一个很棒HTTP客户端:
支持SPDY, 可以合并多个到同一个主机的请求
使用连接池技术减少请求的延迟(如果SPDY是可用的话)
使用GZIP压缩减少传输的数据量
缓存响应避免重复的网络请求
OkHttp可以替换Apache的HttpClient
OkHttp支持2.3和以上版本,对于Java,需要jdk1.7 ,OkHttp需要依赖Okio包
import java.io.IOException;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class PostExample {
public static final MediaType JSON
= MediaType.parse("application/json; charset=utf-8");
OkHttpClient client = new OkHttpClient();
String post(String url, String json) throws IOException {
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
try (Response response = client.newCall(request).execute()) {
return response.body().string();
}
}
String bowlingJson(String player1, String player2) {
return "{'winCondition':'HIGH_SCORE',"
+ "'name':'Bowling',"
+ "'round':4,"
+ "'lastSaved':1367702411696,"
+ "'dateStarted':1367702378785,"
+ "'players':["
+ "{'name':'" + player1 + "','history':[10,8,6,7,8],'color':-13388315,'total':39},"
+ "{'name':'" + player2 + "','history':[6,10,5,10,10],'color':-48060,'total':41}"
+ "]}";
}
public static void main(String[] args) throws IOException {
PostExample example = new PostExample();
String json = example.bowlingJson("Jesse", "Jake");
String response = example.post("http://www.roundsapp.com/post", json);
System.out.println(response);
}
}
参考:
http://www.cnblogs.com/stay/p/4857901.html
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0106/2275.html
目前还有
https://github.com/square/retrofit
square的retrofit、retrofit2.0 项目:
Retrofit 2.0中,OkHttp 是必须的,并且自动设置为了依赖。
OkHttp 在Retrofit 1.9里是可选的。如果你想让Retrofit 使用OkHttp 作为HTTP 连接接口,你需要手动包含okhttp 依赖。
但是在Retrofit 2.0中,OkHttp 是必须的,并且自动设置为了依赖。
Retrofit 、OkHttp 都是 square 的,牛逼公司。
开源社区应该感谢Square、LinkedIn、Google、Facebook、Twitter
国外著名 Android 开发者及公司信息:
http://codekk.com/blogs/detail/codekk/%E5%9B%BD%E5%A4%96%E8%91%97%E5%90%8D%20android%20%E5%BC%80%E5%8F%91%E8%80%85%E5%8F%8A%E5%85%AC%E5%8F%B8%E4%BF%A1%E6%81%AF