一、HTTP协议-请求

1、概念:

1.1.Content-Type:代表发送端(客户端|服务器)发送的实体数据的数据类型。

1.2.Accept: 客服端(浏览器)支持的类型,也是希望服务器响应发送回来的的数据类型

说明:    

Accept:text/xml(application/json);     代表客户端希望接受的数据类型是xml(json )类型    

Content-Type代表发送端(客户端|服务器)发送的实体数据的数据类型。     

Content-Type:text/html(application/json) ;   代表发送端发送的数据格式是html(json)。

二者合起来,Accept:text/xml;Content-Type:text/html    

即代表希望接受的数据类型是xml格式,本次请求发送的数据的数据格式是html。

2、请求:  

请求头(Headers)      

    Accept : text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8  // 自描述消息

请求体(body)

      BODY

springmvc 中 

@RequestBody --> org.springframework.web.bind.annotation.RequestBody

@PathVariable  -->

@RequestParam

@RequestPart

@RequestHeader -->org.springframework.web.bind.annotation.RequestHeader 

。。。。。。

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

q为权重 顺序:text/html, -> application/xhtml+xml -》application/xml;

权重 0.9 --》*/*;q=0.8

Accept:: 告诉服务器客户端可以处理什么类型

@RestController

public class UserController {   

    @RequestMapping("/users/{id}")     

    public User user(@PathVariable String id) {       

        User user = new User();       

        user.setUserId(id);      

        return user;  

   }

}

3、通过Postman测试

3.1、不指定Accept

Http 请求响应与内容协商-LMLPHP

3.2.指定Accept->application/xml

Http 请求响应与内容协商-LMLPHP

4、通过WebMvcConfigurationSupport找原因

Http 请求响应与内容协商-LMLPHP

Http 请求响应与内容协商-LMLPHP

Http 请求响应与内容协商-LMLPHP

Http 请求响应与内容协商-LMLPHP

所有的HTTP自描述消息处理器均在HttpMessageConverter,

MediaType:HttpMessageConverter这个集合会传递到RequestMappingHandlerAdapter,最终控制写出。 messageConverters,其中包含很多自描述消息类型的处理,比如 JSON、XML、TEXT等等

public @interface RequestMapping {   

 String[] produces() default {}; // Accept     

String[] consumes() default {};//Content-Type

}

5、messageConverters的顺序

Http 请求响应与内容协商-LMLPHP

Http 请求响应与内容协商-LMLPHP

二、响应

1、响应:

 状态码  

响应头(Headers)

我们又称为元信息(Meta-Data)        

Accept :          Content-Type :  

响应体(body/payload)      

BODY: http 实体、Rest

Payload: JMS 、SOAP

@ResponseBody --> org.springframework.web.bind.annotation.ResponseBody

2、通过Spring 类看

class org.springframework.http.ResponseEntity<T>{   

 。。。。。。。   

 private final Object status;   

 private final HttpHeaders headers;   

 private final T body; // HttpEntity.body

}

class org.springframework.http.HttpHeaders implements MultiValueMap<String, String> {  

   public static final String ACCEPT = "Accept";   

 public static final String AUTHORIZATION = "Authorization";      

   public static final String CONNECTION = "Connection";   

 public static final String CONTENT_TYPE = "Content-Type";

    。。。。。。。

}

3、简单代码

@Controller @RequestMapping("/zw")

public class Sample2Controller {         

@ResponseBody   

 @RequestMapping("/sample1")     

public String sample1() {         

return "sample2Controller"; // 返回String的body   

 }     

@RequestMapping("/sample2")     

public ResponseEntity<String> sample2(){

        return new ResponseEntity<String>("sample2Controller",HttpStatus.OK); // 指定返回码  

      }

}

4、状态码

HTTP 状态码 spring mvc

参考 org.springframework.http.HttpStatus

200:

304:第一次完整请求,获取响应头(200),第二次请求,响应头(304),取上次body的结果,为了节省带宽

403:

404:

500:

5、HTTP 请求方式

class javax.servlet.http.HttpServlet{    

private static final String METHOD_DELETE = "DELETE";  // 幂等    

private static final String METHOD_GET = "GET"; // org.springframework.web.bind.annotation.GetMapping// 幂等    

private static final String METHOD_POST = "POST"; // 非幂等    

private static final String METHOD_PUT = "PUT"; // 非幂等

}

@RequestMapping(method = RequestMethod.GET)

public @interface GetMapping {   

 @AliasFor(annotation = RequestMapping.class)   

 String name() default "";

}

*注意:annotation 没有继承功能,所以 GetMapping 通过AliasFor 指定,实现RequestMapping的功能

@GetMapping 是注解,@RequestMapping是@GetMapping 的注解

@RequestMapping 是@GetMapping的元注解,

@RequestMapping 标注了@GetMapping

6、AliasFor

@AliasFor 可以为注解本身提供别名

class @interface RequestMapping {      

 @AliasFor("path")        

String[] value() default {}; }

@RequestMapping(method = RequestMethod.GET)

public @interface CustomGetMapping {         

@AliasFor(value="path",annotation = RequestMapping.class)     

String[] ph() default {};     // Alias for {@link RequestMapping#path}.  

   @AliasFor(annotation = RequestMapping.class)     

String[] path() default {};

}

 

7、通过AliasFor 实现继承

@Controller @RequestMapping("/zw")

public class Sample3Controller {   

 @CustomGetMapping(ph ="/sample3")     

public ResponseEntity<String> sample3(){       

 return new ResponseEntity<String>("sample3",HttpStatus.OK);// 指定返回码      

   }     

@CustomGetMapping(path ="/sample4")   

 public ResponseEntity<String> sample4(){     

    return new ResponseEntity<String>("sample4",HttpStatus.OK);// 指定返回码      

   }     

}

Http 请求响应与内容协商-LMLPHP

Http 请求响应与内容协商-LMLPHP

 

 

10-04 18:26