一、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
3.2.指定Accept->application/xml
4、通过WebMvcConfigurationSupport找原因
所有的HTTP自描述消息处理器均在HttpMessageConverter,
MediaType:HttpMessageConverter这个集合会传递到RequestMappingHandlerAdapter,最终控制写出。 messageConverters,其中包含很多自描述消息类型的处理,比如 JSON、XML、TEXT等等
public @interface RequestMapping {
String[] produces() default {}; // Accept
String[] consumes() default {};//Content-Type
}
5、messageConverters的顺序
二、响应
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);// 指定返回码
}
}