遇见的http协议的一些难题

   重构以前的代码,代码是从几年前JPA迁移到SpringMVC+Spring+Mybatis,并且利用springBoot进行微服务部署,springCloud进行分布式。

     期间让我自己写一个Feign的方法调用其他服务,这个接口很简单,但是我却写了大半天才完成。接下来我将介绍一下自己遇见的一些问题

   (1)首先,因为别人并没有在Eureka注册,我就不知道@FeignClient的name属性写什么,后来了解到,可以通过该注解的url属性:url一般用于调试,可以手动指定@FeignClient调用的地址。

   (2) 在访问别人请求的时候,有一系列的要求:最主要的是需要在请求头里放置参数,这个难题当时难倒我了。顺道回忆一下http协议吧。

    ①http协议是基于7层网络协议里面的传输层TCP传输协议。而http不像TCP,会占据系统较多的资源。

    ②http协议是一种短连接,当客户端发出请求,服务端接受到客户端的请求,产生响应,返回给客户端,然后断开连接。
    ③http协议,会认为每次请求都是一次新的请求,因此需要一个识别码,让服务端知道这次的请求是上一个客户端的请求,以便完成操作,这就是session的由来,session在一定程度上依赖cookie。(这是自己的理解,可能不太正确)
    ④http协议分为了几个部分:

          请求信息分为了4部分:

          1.请求行(包含了请求方式、url路径、http协议版本)例如:GET /X.html HTTP/1.1

          2.请求头(已键值对方式,描述客户端相关信息)例如:Content-Type:application/json
          3.空行(作为请求头和消息体之间的标识)
          4.消息体(用于描述表单信息,GET没有,POST有)

          相应信息分为了4部分:
          1.状态行(描述协议版本,状态码,以及状态描述)

          2.响应头(已键值对方式,描述服务端相关信息)
          3.空行(作为响应头和消息体之间的标识)

          4.消息体(描述服务器传输给客户端的信息)

好了,简单地描述完http协议之后,讲述一下,我所涉及到的请求头参数问题。当时要求给个加密后的字段,时间戳。考虑过使用公司编写的feign的拦截器,但是他们告诉我这样做麻烦了,直接使用@requestHeader注解。我当时是采用3个@requestHeader的方式进行传输请求头信息,但是不知为何传输不过去,并且还必须让我写成@requestHeader("content-Type/")这样的形式才不会报错,不知为何要我写/;后来尝试了其他的写法,我在@requestMapping里面写了headers={“content-Type:application/json;charset=utf-8;”}这样仍然报错,不过能看懂了,大体是说我键不正确,由于是参考本公司大佬的写法,找了很久,发现改成headers={“content-Type=application/json;charset=utf-8;”},这样就能够成功传输请求头 其中@RequestHeader("key")String value。


猜你喜欢

转载自blog.csdn.net/qq_40384690/article/details/79953116