HTTP的post和get请求解析

       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;
    }
  }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值