作者:郭孝星
微博:郭孝星的新浪微博
邮箱:[email protected]
博客:http://blog.csdn.net/allenwells
Github:https://github.com/guoxiaoxing
HTTP是一个适用于分布式超媒体信息系统的应用层协议。
HTTP的主要特点如下所示:
HTTP URL地址格式如下所示:
http:// host[":"port][abs_path]
http:表示要通过 HTTP 协议来定位网络资源的
host:表示合法的 Internet 主机域名或者 IP 地址
port:指定一个端口号,为空则使用默认端口 80
abs_path:指定请求资源的 URI(Uniform Resource Identifier,通用资源标志符,指 Web 上任意的可用资源)。
HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。
HTTP报文有两种:请求报文和响应报文。
一个 HTTP 请求报文由请求行、请求报头、空行和请求数据 4 个部分组成,具体如下图所示:
请求行由请求方法字段、URI字段和HTTP协议版本字段组成,它们之间用空格分隔,如下所示:
Method Request-URI HTTP-Version CRLF
Method:表示请求方法
Request-URI:是一个统一资源标识符
HTTP-Version:表示请求的 HTTP 协议版本
CRLF:表示回车和换行(除了作为结尾的 CRLF 外,不允许出现单独的 CR 或 LF 字符)。
请求方法有以下几种:
见下方描述
请求数据不在 GET 方法中使用,而是在 POST 方法中使用。POST 方法适用于需要客户填写表单的场合。与请求数据相关的、最常使用的请求头是 Content-Type 和 Content-Length。在接收和解释请求消息后,服务器会返回一个 HTTP 响应消息。
HTTP响应报文也是由4个部分组成,分别是状态行、消息报头、空行和响应正文,如下所示:
状态行的格式如下所示:
HTTP-Version Status-Code Reason-Phrase CRLF
HTTP-Version 表示服务器 HTTP 协议的版本
Status-Code 表示服务器发回的响应状态代码
Reason-Phrase 表示状态代码的文本描述
状态代码由 3 位数字组成,第一个数字定义了响应的类别,且有 5 种可能取值,如下所示:
1xx 指示信息,表示请求已接受,继续处理
2xx 成功,表示请求已被成功接收、理解、接受
3xx 重定向,要完成请求必须进行进一步的操作
4xx 客户端错误,请求有语法错误或请求无法实现
5xx 服务器端错误,服务器未能实现合法的请求
常见的状态代码如下所示:
200 OK 客户端请求成功
400 Bad Request 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized 请求未经授权
403 Forbidden 服务器收到请求,但是拒绝提供服务
404 Not Found 请求资源不存在,比如输入了错误的 URL
500 Internal Server Error 服务器发生不可预期的错误
503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常
见下方描述
这行是空的。
响应正文就是服务器返回的资源的内容。
关于消息报头
HTTP 消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行 ;对于响应消息,开始行就是状态行)、消息报头(可选)、空行(只有 CRLF 的行)、消息正文(可选)4 部分组成。
报头由“头部字段名 / 值”对组成,每行一对,头部字段名和值用英文冒号“:”分隔,具体如下所示:
头部字段名 +":"+ 空格 + 值
消息报头共有4种类型,如下所示:
HttpClient是Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且支持 HTTP 协议最新的版本和建议。
HttpClient实现的功能有:
HttpClient的使用步骤如下所示:
HttpClient中最常用的方法是GET方法和POST方法。
GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。
使用 GET 方法时,请求参数和对应的值附加在 URL 后面,利用一个问号(“?”)代表 URL的结尾与请求参数的开始。
具体代码如下所示:
// 通过 GET 方法获取页面信息
// 参数为对应页面的 URL
public static InputStream getInputStreamFromUrl(String url) {
// 定义输出流变量
InputStream content = null;
try {
// 取得默认的 HttpClient 实例
HttpClient httpclient = new DefaultHttpClient();
// 连接到服务器
HttpResponse response = httpclient.execute(
// 创建 HttpGet 实例
new HttpGet(url));
// 获取数据内容
content = response.getEntity().getContent();
} catch (Exception e) {
}
// 以 InputStream 形式返回页面信息
return content;
}
面的 GET 方法是以 InputStream 的形式返回页面的信息,很多情况下需要String Builder、 String 等字符串的格式。下面的方法把 InputStream 格式转为 StringBuilder 和 String格式。转换方法如下所示:
// 将 InputStream 格式转化为 StringBuilder 格式
private StringBuilder inputStreamToStringBuilder (InputStream is) {
// 定义空字符串
String line = "";
// 定义 StringBuilder 的实例 total
StringBuilder total = new StringBuilder();
// 定义 BufferedReader,载入 InputStreamReader
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
// readLine 是一个阻塞的方法,当没有断开连接的时候就会一直等待,直到有数据返回
// 返回 null 表示读到数据流最末尾
while ((line = rd.readLine()) != null) {
total.append(line);
}
// 以 StringBuilder 形式返回数据内容
return total;
}
// 将 InputStream 格式数据流转换为 String 类型
private String inputStreamToString(InputStream is) {
// 定义空字符串
String s = "";
String line = "";
// 定义 BufferedReader,载入 InputStreamReader
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
// 读取到字符串中
while ((line = rd.readLine()) != null) {
s += line;
}
// 以字符串方式返回信息
return s;
}
POST方法要求被请求服务器接收附在请求后面的数据,常用于提交表单。
当客户端给服务器提供信息较多时可以使用 POST 方法。POST 方法将请求参数封装在 HTTP 请求数据中,以名称值的形式出现,可以传输大量数据。代码如下所示:
public void postData() {
// 创建一个新的 HttpClient Post 头
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http:// www.google.com");
try {
// 添加数据
List nameValuePairs = new ArrayList(2);
nameValuePairs.add(new BasicNameValuePair("id", "12345"));
nameValuePairs.add(new BasicNameValuePair("stringdata", "myString"));
// 使用 utf-8 格式对数据进行编码
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs ,"UTF-8"));
// 执行 HTTP Post 请求
HttpResponse response = httpclient.execute(httppost);
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
}
在介绍URLConnection之前,我们先来介绍以下URL。
URL(Uniform Resource Locator)代表统一资源定位符,Internet 上的每个资源都具有一个唯一的名称标识,通常称为 URL 地址,这种地址可以是本地磁盘,也可以是局域网上的某一台计算机,更多的是 Internet 上的站点,因此 URL 是指向互联网“资源”的指针。
下面我们再来说说URLConnection。
URLConnection则代表了应用程序和URL之间的通信链接,通URLConnection 类的实例可以读取和写入此URL应用的资源。