概述
HTTP(Hyper Text Transfer Protpcol)协议,超文本传输协议,广泛应用于万维网中,用于网络中数据的传输,是应用层协议,网络相关知识都还给老师了,正好借机会补了下网络的相关知识。
1、网络协议模型
网络协议分为7层,从下到上分别为物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。
物理层:包括机器物理设备连接的媒介,如网线等,数据在该层都是以比特流的形式进行传输
数据链路层:负责数据在物理线路上的传输功能,根据物理地址信息将帧发送到指定的位置,运行在该层的典型设备是交换机
网络层:主要负责将网络地址变换为物理地址,可理解为IP地址和MAC地址的互相解析,并将数据从发送发路由到接收方,运行在该层的典型设备是路由器
传输层:7层模型中最经典的一层,TCP/IP协议位于该层,负责网络中数据的可靠传输,典型的协议为TCP、UDP
会话层:负责在网络中的两节点之间建立和维持通信
表示层:保证接收方能正确解析发送发发来的数据
应用层:用户可直观感受的协议层,如SMTP、HTTP等协议,利用网络中的可靠数据提供服务
在TCP/IP模型中,7层协议被简化成了4层模型,物理层和数据链路层合并为网络接口层,会话层、表示层和应用层统称为应用层,相对于无状态的UDP,TCP是需要发送方和接收方之间建立连接来进行数据传输的,可分为三次握手和四次挥手,具体过程如图示:
三次握手过程
四次挥手过程
2、HTTP请求分析
get请求(无表单数据),抓包获取到的请求信息如下:
header中包含了请求方式、请求的server端地址、用户使用的浏览器信息、cookie信息等
服务端响应如下:
post请求(表单数据userName=admin password=admin),抓包获取到的请求信息如下:
当有表单数据时,除了header头信息之外,表单数据也同时发送给了服务端
服务端响应如下:
3、相关参数说明
服务端常用响应代码
200 - 服务端成功处理请求
204 - 服务端成功处理请求,未返回任何内容
400 - 错误的请求,服务端无法解析该请求
404 - 未找到服务请求的页面
405 - 禁用请求中的方法
500 - 服务器内部错误,通常是代码问题
502 - 错误的网关
503 - 无法使用该服务器
HTTP请求header头中content-type类型
application/x-www-form-urlencoded - 表单数据被编码为key/value格式发送到服务器
application/json - json数据传输格式
multipart/form-data - 文件上传格式
text/html - html格式
text/plain - 纯文本格式
image/jpeg - jpg图片格式
上述仅列出了几种常用的,用到其他的可自行google
4、使用HttpClient和RestTemplate实现HTTP get和post的请求发送
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.client.RestTemplate;
import java.util.Map;
/**.
*/
public class HttpUtil {
private static Logger logger = LoggerFactory.getLogger(HttpUtil.class);
private HttpUtil(){}
/**.
* 拼接http请求的参数
* @param map map
* @return String
*/
public static String getMapStr(Map<String, String> map) {
if (map == null || map.size() == 0) {
return "";
}
StringBuilder sb = new StringBuilder();
for (Map.Entry<String, String> entry : map.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
sb.append(key).append("=").append(value).append("&");
}
return sb.substring(0, sb.length() - 1);
}
/**.
* 进行post调用,返回调用信息
* @param url url
* @param jsonStr jsonStr
* @return Object
*/
public static String invoke(String url, String jsonStr) {
logger.info("发起HTTP POST请求,请求地址为{},请求参数为{}",url,jsonStr);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType
.parseMediaType("application/x-www-form-urlencoded; charset=UTF-8"));
HttpEntity<String> postBody = new HttpEntity<>(jsonStr, headers);
RestTemplate restTemplate = new RestTemplate();
String resultStr = restTemplate.postForObject(url, postBody, String.class);
logger.info("HTTP请求调用结束,返回信息为{}",resultStr);
return resultStr;
}
/**.
* 发送http get请求
* @param url url
* @param jsonStr jsonStr
* @return String
*/
public static HttpResponse httpGet(String url, String jsonStr) {
logger.info("发起HTTP GET请求,请求地址为{},请求参数为{}",url,jsonStr);
/*RestTemplate restTemplate = new RestTemplate();
HttpResponse response = restTemplate.getForObject(
(jsonStr == null || "".equals(jsonStr.trim()))
? url : (url + "?" + jsonStr), HttpResponse.class);*/
try {
HttpClient httpclient = new DefaultHttpClient();
HttpGet getMd = new HttpGet(
(jsonStr == null || "".equals(jsonStr.trim())) ? url : (url + "?" + jsonStr)
);
HttpResponse response = httpclient.execute(getMd);
//设置response的编码等
//response.setCharacterEncoding("utf-8");
//response.setContentType("application/json");
logger.info("HTTP请求调用结束");
return response;
} catch (Exception e1) {
logger.info("HTTP请求发生异常");
logger.error("",e1);
return null;
}
}
}
最后
以上就是感动发箍为你收集整理的HTTP的post和get请求解析的全部内容,希望文章能够帮你解决HTTP的post和get请求解析所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复