1、概述
Web客户端(或浏览器)和服务器之间的交互用的是一个基于本文的应用级协议,叫做HTTP。
客户端利用TCP发起一个HTTP请求到服务器上指定端口(默认端口为80),服务器响应所请求的内容,并关闭连接。对于Web客户端和服务器而言,内容是与一个MIME类型相关的字节序列。常用的MIME(多用途的网际邮件扩充协议)类型有:text/html(HTML页面)、text/plain、application/postscript、image/gif、image/jpeg(JPEG格式编码的二进制图像)。
Web服务器以两种不同的方式向客户端提供内容:
*取一个磁盘文件,并讲它的内容返回给客户端,即服务静态内容。
*运行一个可执行文件,并将它的输出返回给客户端,即服务动态内容。
2、About URL
由上文可见Web服务器返回的内容都是和它管理的文件相关连的,而每一个文件都有一个唯一的名字,叫做URL(通用资源定位符)。
如,http://www.google.com:80/index.html 表示主机www.google.com上的一个名为index.html的HTML文件,它是由一个监听端口80的Web服务管理的。(那么问题来了,为啥只输入"http://www.google.com"也可以访问内容?因为浏览器在后面添加了"/",传给服务器后,服务器又拓展为某个默认的主页。而端口号是可选的,默认为80)。
可执行文件的URL可以在文件后包括程序参数,用"?"来分割文件名和参数,每个参数都用"&"字符分隔开。确定一个URL指向的是静态还是动态内容没有标准的规则。一种常见的方法是,将他们放在不同组目录下。
3、HTTP事务
3.1 HTTP请求,
在HTTP/1.0中只定义了GET、POST和HEAD三种方法(也叫“动作”),来操作指定的资源。
而HTTP/1.1协议将其扩展到了八种,包括:
- POST:向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
- GET:向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在中。其中一个原因是GET可能会被等随意访问。
- OPTIONS:这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用'*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
- HEAD:与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部份。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
- PUT:向指定资源位置上传其最新内容。
- DELETE:请求服务器删除Request-URI所标识的资源。
- TRACE:回显服务器收到的请求,主要用于测试或诊断。
- CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
其中GET和POST方法最为常见:
GET方法常用来取得HTML文档或图形,或根据用户提交的搜索项目取得搜索结果。GET请求在URL中向服务器发信息,如,fredzzt.cn/search?name=value&name1=value1。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。
POST方法是将信息发送到服务器上,如验证码或从用户输入表单中收集的数据。POST方法以HTTP消息发送表单数据(而不是URL),由于将数据嵌入HTTP消息中,从而对用户隐藏更加安全。
二者的更多区别:
3.2 HTTP响应
HTTP通过一个三位正整数,指明对请求的处理。常见的有404、400等。详见:http://zh.wikipedia.org/wiki/HTTP%E7%8A%B6%E6%80%81%E7%A0%81
4、Android的HTTP API
当你希望你的app连接到Internet时,你都需要在Manifest.xml中包含android.permission.INTERNET权限。
4.1 Apache HTTP客户端类
适合于Web浏览器,并且功能丰富。
包括DefaultHttpClient和AndroidHttpClient,二者主要有以下几点区别:首先,AndroidHttpClient是在2.2版本才引入的;其次,AndroidHttpClient容许SSL管理,有简单的方法来指定UserAgent;再次,他们的连接超时和套接字超时的默认值不同;最后,他们生成实例的方式不同,DefaultHttpClient client = new DefaultHttpClient(); AndroidHttpClient client = AndroidHttpClient.newInstance(null);
用DefaultHttpClient实现GET和POST:
4.1.1GET请求时你只要指定URL
HttpClient client = new DefaultHttpClient();
String getURL = "http://www.google.com/getrequest"; HttpGet get = new HttpGet(getURL); try { HttpResponse responseGet = client.execute(get); } catch (IOException e) { e.printStackTrace(); }4.1.2POST请求将数据作为请求的有效载荷的一部分
HttpClient client = new DefaultHttpClient();
String postURL = "http://www.google.com"; HttpPost post = new HttpPost(postURL); List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("key1","value1")); try { UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params, HTTP.UTF_8); post.setEntity(ent); HttpResponse responsePOST = client.execute(post); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }
除非服务器响应,否则execute调用不会返回,即引起阻塞。所以,应其他线程中运行HTTP操作;
4.2 HttpURLConnection类
HttpURLConnection是适合在2.2版本之后版本使用的轻量级客户端。
用HttpURLConnection实现GET:
URL url = null;
HttpURLConnection urlConnection = null; try { url = new URL("http://www.google.com"); urlConnection = (HttpURLConnection)url.openConnection(); //建立连接 int statusCode = urlConnection.getResponseCode(); InputStream in = new BufferedInputStream(urlConnection.getInputStream()); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { urlConnection.disconnect(); }