我爱编程

http头部content-type与后台解析数据方式

2018-04-08  本文已影响102人  MrOldK

http 头部中的 content-type 和我们传递的数据以及后台处理数据的方式是息息相关的,不同的取值,服务器解析处理方式不同。
协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么编码方式。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。

但是,数据发送出去,还要服务端解析成功才有意义。一般服务端语言如 php、python 等,以及它们的 framework,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。
text/plain:ajax
默认方式,将文件设置为纯文本的形式,浏览器在获取到这种文件时并不会对其进行处理(最原始的流)

20161102184458315.png
application/x-www-form-urlencoded
form表单默认的方式,在$.ajax中如果未设置contentType默认也会以这种方式, 在servlet中的把对应的key、value进行相应的处理添加到Map中,所有才能通过request.getParameter()获取,在servlet中的request.getParameter()只能取到 在url 后面的参数与 这种方式提交的数据。
[图片上传失败...(image-efdf46-1536411721990)]

注意: 这种方式传递的数据千万不能乱用JSON.Stringify()格式化,只能传入原始对象(LZ开始就犯了这样的错,导致取不到值)

var  info={  
      "name":"yhy",  
       age:22  
}  
   $.ajax({    
      url: 'ddds' ,    
      type: 'post',    
      data: info,    
      async: true,    
      dataType:'json',  
      success: function (data,state) {    
      },    
      error: function (data,state) {    
      } ,  
 }); 

multipart/form-data
多用于文件上传,html5伴随出现的formdata 也正用于此(支持普通表单、文件上传,若是传文件则服务器采用特有formdata的解析方式),传递的时候通过流的形式,数据包的格式也有所不同。

20161102172731364.png

注意:这里 传入的数据必须格式化JSON.stringify(),不能直接传入原始对象,servlet中解析的时候通过读流的方式(不包含formdata格式)

StringBuffer json = new StringBuffer();  
      String line = null;  
      try{  
          BufferedReader reader = request.getReader();  
          while((line=reader.readLine())!=null){  
              json.append(line);  
          }  
      }  
      catch(Exception e){  
          System.out.println(e.toString());  
            
      }  
      System.out.println(json.toString());  

application/json
这是现在比较常用的方式,在发送数据之前需格式化数据JSON.stringify(),确保格式的正确性,服务器解析方式和上面第二种一样,先获取json字符串在转为JSON对象。

20161102173719069.png
数据传输通过chrom开发工具可获取到的数据

1、get方式,会在url后面添加参数,并在包含在 Query String parameters


20161102184946023.png

2、post方式
a、form-data, 这种设置conten-type为application/x-www-form-urlencoded ,servlet 中可通过request.getParameter()获取

b、Request-Payload,通过输入流来获取,在上面已介绍。

上一篇下一篇

猜你喜欢

热点阅读