HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
TCP/IP通信协议:
计算机网络体系结构分层
不难看出,TCP/IP 与 OSI 在分层模块上稍有区别。OSI 参考模型注重“通信协议必要的功能是什么”,而 TCP/IP 则更强调“在计算机上实现协议应该开发哪种程序”。
(1)请求方法URI协议/版本
请求的第一行是“方法URL协议版本”:GET/sample.jsp HTTP/1.1
以上代码中“GET”代表请求方法,“/sample.jsp”表示URI,“HTTP/1.1代表协议和协议的版本。
根据HTTP标准,HTTP请求可以使用多种请求方法。例如:HTTP1.1支持7种请求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。在Internet应用中,最常用的方法是GET和POST。
URL完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以“/”开头,最后,协议版本声明了通信过程中使用HTTP的版本。
(2)请求头(Request Header)
请求头包含许多有关的客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器所用的语言,请求正文的长度等。
Accept:image/gif.image/jpeg.*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)
Accept-Encoding:gzip,deflate.
(3) 请求正文
请求头和请求正文之间是一个空行,这个行非常重要,它表示请求头已经结束,接下来的是请求正文。请求正文中可以包含客户提交的查询字符串信息:
username=jinqiao&password=1234
在以上的例子的HTTP请求中,请求的正文只有一行内容。当然,在实际应用中,HTTP请求正文可以包含更多的内容。
响应消息包括状态行、若干头部行和附属体(html数据实体)。
状态行包括:HTTP协议版本号、状态码、状态码的文本描述信息。如:HTTP/1.1 200 OK
状态码由一个三位数组成,状态码大体有5种含义:
1. 1xx。信息,请求收到,继续处理。
2. 2xx。成功。200请求成功;206断点续传。
3. 3xx。重定向。一般跳转到新的地址。
4. 4xx。客户端错误。404文件不存在
5. 5xx。服务器错误。500内部错误。
一次HTTP操作称为一个事务,其工作过程可分为四步:
1)首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。
2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。
例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:
1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
3、浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
4、服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
5、释放 TCP连接;
6、浏览器将该 html 文本并显示内容;
http调用工具:
1、application/json
String param = JSONObject.fromObject(jsonMap).toString();
public static String callChannelInterface(String url,String param) throws IOException {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
// 设置请求的header
httppost.addHeader("Content-type", "application/json");
// 设置请求的参数
StringEntity entity = new StringEntity(param.toString(), "utf-8");
httppost.setEntity(entity);
HttpResponse response = httpclient.execute(httppost);
if (response.getStatusLine().getStatusCode() == 200) {
/*读返回数据*/
String conResult = EntityUtils.toString(response.getEntity());
if(conResult!=null && !conResult.equals("[]") && StringUtils.isNotBlank(conResult) && StringUtils.isNotBlank(conResult)){
return conResult;
}else{
return "返回数据为空";
}
} else {
String err = response.getStatusLine().getStatusCode()+"";
return "发送失败"+err;
}
}
2、plain/text
String param = JSONObject.fromObject(jsonMap).toString()
public static String callChannelTextInterface(String url,String param) throws IOException {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
// 设置请求的header
httppost.addHeader("Content-type", "plain/text");
// 设置请求的参数
StringEntity entity = new StringEntity(param.toString(), "utf-8");
httppost.setEntity(entity);
HttpResponse response = httpclient.execute(httppost);
if (response.getStatusLine().getStatusCode() == 200) {
/*读返回数据*/
String conResult = EntityUtils.toString(response.getEntity());
if(conResult!=null && !conResult.equals("[]") && StringUtils.isNotBlank(conResult) && StringUtils.isNotBlank(conResult)){
return conResult;
}else{
return "返回数据为空";
}
} else {
String err = response.getStatusLine().getStatusCode()+"";
return "发送失败"+err;
}
}
3、application/x-www-form-urlencoded
public static String callChannelFormData(String url,Map<String,String> param) throws IOException {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
// 设置请求的header
httppost.addHeader("Content-type", "application/x-www-form-urlencoded");
// 设置请求的参数
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
for (String key : param.keySet()) {
nameValuePairs.add(new BasicNameValuePair(key, param.get(key))); //请求接口的参数
}
StringEntity entity = new UrlEncodedFormEntity(nameValuePairs, "UTF-8");
httppost.setEntity(entity);
HttpResponse response = httpclient.execute(httppost);
if (response.getStatusLine().getStatusCode() == 200) {
/*读返回数据*/
String conResult = EntityUtils.toString(response.getEntity());
if(conResult!=null && !conResult.equals("[]") && StringUtils.isNotBlank(conResult) && StringUtils.isNotBlank(conResult)){
return conResult;
}else{
return "返回数据为空";
}
} else {
String err = response.getStatusLine().getStatusCode()+"";
return "发送失败"+err;
}
}