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/国外著名 android 开发者及公司信息