拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Http请求中Content-Type讲解以及在Spring MVC中的应用

引言在HTTP请求中我们每天都在使用Content-Type来指定不同格式的请求信息但是却很少有人去全面了解Content-Type中允许的值有多少。本文将讲解Content-Type的可用值以及在Spring MVC中如何使用它们来映射请求信息。本文全面介绍了HTTP请求中Content-Type媒体类型的格式、常见值及其在SpringMVC中的应用。主要内容包括Content-Type的格式规范type/subtype;parameter和常见类型如text/html、application/json、multipart/form-data等SpringMVC中RequestMapping注解的consumes/produces等参数如何使用Content-Type进行请求过滤实际应用示例headers匹配如Acceptapplication/jsonparams参数过滤consumes限制请求内容类型produces控制响应类型补充了HTTP请求头和响应头的常见字段说明 文章最后总结了Content-Type在请求控制中的核心作用并提供了相关参考资料。全文系统性地梳理了媒体类型在Web开发中的关键应用场景。1. Content-TypeMediaType即是Internet Media Type互联网媒体类型也叫做MIME类型在HTTP协议消息头中使用Content-Type来表示具体请求中的媒体类型信息。1.1 类型格式类型格式type/subtype(;parameter)?type主类型任意的字符串如text如果是*号代表所有subtype子类型任意的字符串如html如果是*号代表所有parameter可选一些参数如Accept请求头的q参数Content-Type的charset参数例如Content-Type: text/html;charsetutf-8;1.2 常见的媒体格式类型常见的媒体格式类型如下text/htmlHTML格式text/plain纯文本格式text/xmlXML格式image/gifgif图片格式image/jpegjpg图片格式image/pngpng图片格式1.3 以application开头的媒体格式类型application/xhtmlxmlXHTML格式application/xmlXML数据格式application/atomxmlAtom XML聚合格式application/jsonJSON数据格式application/pdfpdf格式application/mswordWord文档格式application/octet-stream二进制流数据如常见的文件下载application/x-www-form-urlencodedform encType中默认的encTypeform表单数据被编码为key/value格式发送到服务器表单默认的提交数据的格式1.4 文件上传格式另外一种常见的媒体格式是上传文件之时使用的multipart/form-data需要在表单中进行文件上传时就需要使用该格式以上就是我们在日常的开发中经常会用到的若干Content-Type的内容格式。2. Spring MVC中Content-Type类型信息的使用首先我们来看看RequestMapping中的Class定义Target({ElementType.METHOD, ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Documented Mapping public interface RequestMapping { String[] value() default {}; RequestMethod[] method() default {}; String[] params() default {}; String[] headers() default {}; String[] consumes() default {}; String[] produces() default {}; }各参数说明value指定请求的实际地址比如 /action/info之类method指定请求的method类型GET、POST、PUT、DELETE等consumes指定处理请求的提交内容类型Content-Type例如application/json, text/htmlproduces指定返回的内容类型仅当request请求头中的(Accept)类型中包含该指定类型才返回params指定request中必须包含某些参数值时才让该方法处理headers指定request中必须包含某些指定的header值才能让该方法处理请求其中consumes、produces使用Content-Type信息进行过滤headers中也可以使用Content-Type进行过滤和判断。3. 使用示例3.1 headers示例示例1RequestMapping(value /test, method RequestMethod.GET, headers Refererhttp://www.ifeng.com/) public void testHeaders(PathVariable String ownerId, PathVariable String petId) { // implementation omitted }这里的Headers里面可以匹配所有Header里面可以出现的信息不局限在Referer信息。示例2RequestMapping(value /response/ContentType, headers Acceptapplication/json) public void response2(HttpServletResponse response) throws IOException { // 表示响应的内容区数据的媒体类型为json格式且编码为utf-8(客户端应该以utf-8解码) response.setContentType(application/json;charsetutf-8); // 写出响应体内容 String jsonData {\username\:\zhang\, \password\:\123\}; response.getWriter().write(jsonData); }服务器根据请求头Acceptapplication/json生产json数据。当你有如下Accept头将遵守如下规则进行应用Accepttext/html,application/xml,application/json 将按照如下顺序进行produces的匹配①text/html ②application/xml ③application/jsonAcceptapplication/xml;q0.5,application/json;q0.9,text/html 将按照如下顺序进行produces的匹配①text/html ②application/json ③application/xml 参数为媒体类型的质量因子越大则优先权越高(从0到1)Accept*/*,text/*,text/html 将按照如下顺序进行produces的匹配①text/html ②text/* ③*/*即匹配规则为最明确的优先匹配。3.2 params示例RequestMapping(value /test/{userId}, method RequestMethod.GET, params myParammyValue) public void findUser(PathVariable String userId) { // implementation omitted }仅处理请求中包含了名为myParam值为myValue的请求起到了一个过滤的作用。3.3 consumes/produces示例Controller RequestMapping(value /users, method RequestMethod.POST, consumes application/json, produces application/json) ResponseBody public ListUser addUser(RequestBody User user) { // implementation omitted return ListUser users; }方法仅处理request Content-Type为application/json类型的请求。produces标识处理request请求中Accept头中包含了application/json的请求同时暗示了返回的内容类型为application/json。4.Requests部分Header解释示例Accept指定客户端能够接收的内容类型Accept: text/plain, text/htmlAccept-Charset浏览器可以接受的字符编码集。Accept-Charset: iso-8859-5Accept-Encoding指定浏览器可以支持的web服务器返回内容压缩编码类型。Accept-Encoding: compress, gzipAccept-Language浏览器可接受的语言Accept-Language: en,zhAccept-Ranges可以请求网页实体的一个或者多个子范围字段Accept-Ranges: bytesAuthorizationHTTP授权的授权证书Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQCache-Control指定请求和响应遵循的缓存机制Cache-Control: no-cacheConnection表示是否需要持久连接。HTTP 1.1默认进行持久连接Connection: closeCookieHTTP请求发送时会把保存在该请求域名下的所有cookie值一起发送给web服务器。Cookie: $Version1; Skinnew;Content-Length请求的内容长度Content-Length: 348Content-Type请求的与实体对应的MIME信息Content-Type: application/x-www-form-urlencodedDate请求发送的日期和时间Date: Tue, 15 Nov 2010 08:12:31 GMTExpect请求的特定的服务器行为Expect: 100-continueFrom发出请求的用户的EmailFrom: useremail.comHost指定请求的服务器的域名和端口号Host: www.zcmhi.comIf-Match只有请求内容与实体相匹配才有效If-Match: “737060cd8c284d8af7ad3082f209582d”If-Modified-Since如果请求的部分在指定时间之后被修改则请求成功未被修改则返回304代码If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMTIf-None-Match如果内容未改变返回304代码参数为服务器先前发送的Etag与服务器回应的Etag比较判断是否改变If-None-Match: “737060cd8c284d8af7ad3082f209582d”If-Range如果实体未改变服务器发送客户端丢失的部分否则发送整个实体。参数也为EtagIf-Range: “737060cd8c284d8af7ad3082f209582d”If-Unmodified-Since只在实体在指定时间之后未被修改才请求成功If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMTMax-Forwards限制信息通过代理和网关传送的时间Max-Forwards: 10Pragma用来包含实现特定的指令Pragma: no-cacheProxy-Authorization连接到代理的授权证书Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQRange只请求实体的一部分指定范围Range: bytes500-999Referer先前网页的地址当前请求网页紧随其后,即来路Referer: http://www.zcmhi.com/archives/71.htmlTE客户端愿意接受的传输编码并通知服务器接受接受尾加头信息TE: trailers,deflate;q0.5Upgrade向服务器指定某种传输协议以便服务器进行转换如果支持Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11User-AgentUser-Agent的内容包含发出请求的用户信息User-Agent: Mozilla/5.0 (Linux; X11)Via通知中间网关或代理服务器地址通信协议Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)Warning关于消息实体的警告信息Warn: 199 Miscellaneous warning5.Responses 部分Header解释示例Accept-Ranges表明服务器是否支持指定范围请求及哪种类型的分段请求Accept-Ranges: bytesAge从原始服务器到代理缓存形成的估算时间以秒计非负Age: 12Allow对某网络资源的有效的请求行为不允许则返回405Allow: GET, HEADCache-Control告诉所有的缓存机制是否可以缓存及哪种类型Cache-Control: no-cacheContent-Encodingweb服务器支持的返回内容压缩编码类型。Content-Encoding: gzipContent-Language响应体的语言Content-Language: en,zhContent-Length响应体的长度Content-Length: 348Content-Location请求资源可替代的备用的另一地址Content-Location: /index.htmContent-MD5返回资源的MD5校验值Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQContent-Range在整个返回体中本部分的字节位置Content-Range: bytes 21010-47021/47022Content-Type返回内容的MIME类型Content-Type: text/html; charsetutf-8Date原始服务器消息发出的时间Date: Tue, 15 Nov 2010 08:12:31 GMTETag请求变量的实体标签的当前值ETag: “737060cd8c284d8af7ad3082f209582d”Expires响应过期的日期和时间Expires: Thu, 01 Dec 2010 16:00:00 GMTLast-Modified请求资源的最后修改时间Last-Modified: Tue, 15 Nov 2010 12:45:26 GMTLocation用来重定向接收方到非请求URL的位置来完成请求或标识新的资源Location: http://www.zcmhi.com/archives/94.htmlPragma包括实现特定的指令它可应用到响应链上的任何接收方Pragma: no-cacheProxy-Authenticate它指出认证方案和可应用到代理的该URL上的参数Proxy-Authenticate: Basicrefresh应用于重定向或一个新的资源被创造在5秒之后重定向由网景提出被大部分浏览器支持Refresh: 5; urlhttp://www.zcmhi.com/archives/94.htmlRetry-After如果实体暂时不可取通知客户端在指定时间之后再次尝试Retry-After: 120Serverweb服务器软件名称Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)Set-Cookie设置Http CookieSet-Cookie: UserIDJohnDoe; Max-Age3600; Version1Trailer指出头域在分块传输编码的尾部存在Trailer: Max-ForwardsTransfer-Encoding文件传输编码Transfer-Encoding:chunkedVary告诉下游代理是使用缓存响应还是从原始服务器请求Vary: *Via告知代理客户端响应是通过哪里发送的Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)Warning警告实体可能存在的问题Warning: 199 Miscellaneous warningWWW-Authenticate表明客户端请求实体应该使用的授权方案WWW-Authenticate: Basic6. 总结在本文中首先介绍了Content-Type主要支持的格式内容然后基于RequestMapping标注的内容介绍了主要的使用方法其中,headers, consumes,produces,都是使用Content-Type中使用的各种媒体格式内容可以基于这个格式内容来进行访问的控制和过滤。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门