zoukankan      html  css  js  c++  java
  • Content-Type /AJAX /@ResponseBody

    Content-Type

    Content-Type(内容类型),(Mime-Type)一般是指网页中存在的 Content-Type,用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件。用于指示资源的MIME类型,如果未指定 ContentType,默认为text/html 有两种场景: 在请求中 (如POST 或 PUT),客户端告诉服务器实际发送的数据类型。

    在request请求中是告诉服务器发送给服务器的内容类型。在response请求中是服务器告诉浏览器传输过来的是什么类型,浏览器根据该类型来决定怎么解析发过来的资源。

    参数一般media-type、charset、boundary三种。 我们的关注点在于media-type的取值以及其适用场景。

    Content-Type: text/html; charset=utf-8
    Content-Type: multipart/form-data; boundary=something
    

    一个MIME类型至少包括两个部分:一个类型(type)和一个子类型(subtype)

    MIME类型

    • text/html : HTML格式
    • text/plain :纯文本格式
    • text/xml : XML格式
    • image/gif :gif图片格式
    • image/jpeg :jpg图片格式
    • image/png:png图片格式

    以application开头的媒体格式类型:

    • application/xhtml+xml :XHTML格式
    • application/xml: XML数据格式
    • application/atom+xml :Atom XML聚合格式
    • application/json: JSON数据格式
    • application/pdf:pdf格式
    • application/msword : Word文档格式
    • application/octet-stream : 二进制流数据(如常见的文件下载)
    • application/x-www-form-urlencoded : <form encType="">中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)

    另外一种常见的媒体格式是上传文件之时使用的:

    • multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式

    application/json

    随着json这种轻量级的数据交互格式的流行,特别是和脚本交互的便利,使得在前后接口中,越来越多采用json格式。对于http协议来说,最终传输的还是字符。这里不再多进行描述。

    {name: "John", age: 31, city: "New York"};
    

    image-20200812180112935

    application/x-www-form-urlencoded 作为表单提交中默认的类型,其表明数据以标准的编码格式被编码为键值对。 数据被编码成以 '&' 分隔的键-值对, 同时以 '=' 分隔键和值. 非字母或数字的字符会被 percent-encoding: 这也就是为什么这种类型不支持二进制数据的原因 (应使用 multipart/form-data 代替)。参数中的中文都被url编码成了支持的字符

    image-20200812175721197

    multipart/form-data 这里为了对比,就也放到这里来说了。
    一般用于涉及文件的表单提交,用于post请求,其格式如下

    Content-Type: multipart/form-data; boundary=aBoundaryString
    

    其中boundary指明了请求体中每部分的分割符(对于multipart的类目,都会存在该字段,以区分请求体中数据的分割),其请求体中则是对应表单每部分的内容。每部分都会有自己的请求体和相关内容。multipart可以上传多个不同的contentType的文件,一个请求头对应多个请求体
    例如如下的文档结构:

    image-20200812180437870

    正如上文所述,multipart一般对应单个消息头对应多个消息体。 常见语法如下:

    Content-Type: multipart/mixed; boundary=gc0p4Jq0M2Yt08jU534c0p
    
    

    其中boundary字段是必须的,用于区分消息体中的数据边界,一般是两个'-'的格式作为该端的开头,例如:

    --gc0p4Jq0M2Yt08jU534c0p
    

    JQuery中的Ajax请求的参数

    data

    类型: [Object, String](https://www.jquery123.com/Types/#Object, String)

    发送到服务器的数据。将自动转换为请求字符串格式。GET 请求中将附加在 URL 后面。查看 processData 选项说明,以禁止此自动转换。对象必须为"{键:值}"格式。如果这个参数是一个数组,jQuery会按照traditional 参数的值, 将自动转化为一个同名的多值查询字符串(查看下面的说明)。注:如 {foo:["bar1", "bar2"]} 转换为 '&foo=bar1&foo=bar2'。

    processData (默认: true)

    类型: Boolean

    默认情况下,通过data选项传递进来的数据,如果是一个对象(技术上讲只要不是字符串),都会处理转化成一个查询字符串,以配合默认内容类型 "application/x-www-form-urlencoded"。如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false

    dataType (默认: Intelligent Guess (xml, json, script, or html))

    类型: String

    预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如XML MIME类型就被识别为XML。在1.4中,JSON就会生成一个JavaScript对象,而script则会执行这个脚本。随后服务器端返回的数据会根据这个值解析后,传递给回调函数。可用值:

    • "xml": 返回 XML 文档,可用 jQuery 处理。.
    • "html": 返回纯文本 HTML 信息;包含的script标签会在插入dom时执行。
    • "script": 把响应的结果当作 JavaScript 执行。并将其当作纯文本返回。默认情况下不会通过在URL中附加查询字符串变量 "_=[TIMESTAMP]" 进行自动缓存结果,除非设置了cache参数为trueNote: 在远程请求时(不在同一个域下),所有POST请求都将转为GET请求。(因为将使用DOM的script标签来加载)
    • "json": 把响应的结果当作 JSON 执行,并返回一个JavaScript对象。在 jQuery 1.4 中,JSON 格式的数据以严格的方式解析,如果格式有错误,jQuery都会被拒绝并抛出一个解析错误的异常。(见json.org的更多信息,正确的JSON格式。)
    • "jsonp": 以 JSONP 的方式载入 JSON 数据块。会自动在所请求的URL最后添加 "?callback=?"。默认情况下不会通过在URL中附加查询字符串变量 "_=[TIMESTAMP]" 进行自动缓存结果,除非将 cache参数设置为true
    • "text": 返回纯文本字符串。

    contentType (默认: 'application/x-www-form-urlencoded; charset=UTF-8')

    类型: String

    发送信息至服务器时内容编码类型。默认值是"application/x-www-form-urlencoded; charset=UTF-8",适合大多数情况。如果你明确地传递了一个内容类型(Content-Type)给 $.ajax(),那么他必定会发送给服务器(即使没有数据要发送)。数据将总是使用UTF-8字符集传递给服务器;你必须在服务器端进行适当的解码。

    ajax请求中如果不设置ContentType 默认进去urlencode 如果这时候在controller中写了RequestBody注解,就会报错

    415

    image-20200812182322133

    @RequestBody

    https://blog.csdn.net/justry_deng/article/details/80972817

    @RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。

    RequestBody 接收的是请求体里面的数据;而RequestParam接收的是key-value里面的参数

    后端@RequestBody注解对应的类在将HTTP的输入流(含请求体)装配到目标类(即:@RequestBody后面的类)时,会根据json字符串中的key来匹配对应实体类的属性,如果匹配一致且json中的该key对应的值符合(或可转换为

    • json字符串中,如果value为""的话,后端对应属性如果是String类型的,那么接受到的就是"",如果是后端属性的类型是Integer、Double等类型,那么接收到的就是null。
    • json字符串中,如果value为null的话,后端对应收到的就是null。
    • 如果某个参数没有value的话,在传json字符串给后端时,要么干脆就不把该字段写到json字符串中;要么写value时, 必须有值,"key":null "key":""都行。不能写成"key":

    如果没有使用@RequestBody注解,那么一个复杂对象User,需要从key-value中找和属性名相同的key进行封装,如果这时候浏览器传过来的是一个json字符串,就不能进行自动封装,因此如果浏览器端传过来的json,需要从使用@RequestBody接受。

  • 相关阅读:
    HDU 1941 Justice League
    HDU 1960 Taxi Cab Scheme
    POJ 1986 Distance Queries
    UVA 11991 Easy Problem from Rujia Liu?
    sql的跟踪与Tkprof工具
    ORA04031 错误
    Oracle_spatial的空间索引
    oracle发生重启动的介绍
    expdp\impdp及exp\imp
    oracle锁
  • 原文地址:https://www.cnblogs.com/land-fill/p/13492808.html
Copyright © 2011-2022 走看看