浅析http请求的content-type及使用场景

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 在HTTP协议消息头中,使用Content-Type来表示媒体类型信息。它被用来告诉服务端如何处理请求的数据,以及告诉客户端(一般是浏览器)如何解析响应的数据,比如显示图片,解析html或仅仅展示一个文本等。

Content-type类型

在HTTP协议消息头中,使用Content-Type来表示媒体类型信息。它被用来告诉服务端如何处理请求的数据,以及告诉客户端(一般是浏览器)如何解析响应的数据,比如显示图片,解析html或仅仅展示一个文本等。

Post请求的内容放置在请求体中,Content-Type定义了请求体的编码格式。数据发送出去后,还需要接收端解析才可以。接收端依靠请求头中的Content-Type字段来获知请求体的编码格式,最后再进行解析。开发过程中主要有如下几种content-type类型:

  • text/xml

该种方式主要用来提交XML格式的数据。

  • application/x-www-form-urlencoded

浏览器的原生form表单,如果不设置enctype属性,那么最终会以applicatiion/x-www-form-urlencoded方式提交数据。这种方式提交数据放在body里面,数据按照key1=value1&key2=value2的方式进行编码。

  • multipart/form-data

这种方式也是常见的post提交方式,通常表单上传时使用该方法。

  • application/json

告诉服务器主体的序列化的json字符串。

使用场景

开发过程中主要用到“application/x-www-form-urlencoded”、“application/json”、“multipart/form-data”三种类型,下面我们就来详细说说这三种类型的结构和在SpringMVC中的使用场景:

### 1. application/x-www-form-urlencoded
当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2…),然后把这个字串append到url后面,用?分割,加载这个新的url。 当action为post时候,浏览器把form数据封装到http body中,然后发送到server
客户端:

  header:Content-Type=application/x-www-form-urlencoded
  Method:get方法-参数需要做URLEncode
  Post方法-构建nameValuePairList列表放入UrlEncodedFormEntity
List<NameValuePair> nameValuePairList = new ArrayList<~>();
        nameValuePairList.add(new BasicNameValuePair( name: "name", value: "zhangsan"));
        nameValuePairList.add(new BasicNamevaluePair( name: "birthday" value: "1990-08-25"));
        UrlEncodedFormEntity entityParam = new UrlEncodedFormEntity(namevaluePairlist, charset: "UTF-8");
        post.setEntity(entityParam);

服务端:

  请求参数不含MultlpartFile类型时可同时支持 GET和POST,具体请参考以下规范:
     controller方法注解@RequestMapping(method = {RequestMethod.POST, RequestMethod.GET})
  上传文件:只支持POST(包括MutipleFile和Base64字符串)
  方法参数可以对象构成:不能加@RequestBody注解,否则不能接收到

    @RequestMapping(value = "/testParamForm", method = {RequestMethod.POST,RequestMethod.GET})
    @ApiOperation("Content-type:application/x-www-form-urlencoded, 同时支持POST和GET,多个请求参数,无上传文件, URL和body的请求参数可以正常获取,URL的参数encode转码 ")
    @ApiResponses(value={@ApiResponse(code = 200, message = "请求成功")})
    public Result testParamForm(String name, String idcard){

        log.info("name:{}, idcard:{}", name, idcard);

        return ResultUtil.success();
    }

如果是请求参数超过3个以上,可以封装成请求参数对象:

    @RequestMapping(value = "/testObjForm", method = {RequestMethod.POST,RequestMethod.GET})
    @ApiOperation("Content-type:application/x-www-form-urlencoded, 同时支持POST和GET,封装请求参数对象,无上传文件 ")
    @ApiResponses(value={@ApiResponse(code = 200, message = "请求成功")})
    public Result testObjForm(IdcardRequestDto idcardRequestDto){

        log.info("name:{}, idcard:{}, file: {}", idcardRequestDto.getName(), idcardRequestDto.getIdcard(), idcardRequestDto.getFile());

        return ResultUtil.success();
    }

### 2. application/json
客户端:

  header:Content-Type=application/json
   Mehthod:POST
  请求参数json字符串,格式如:"{\"name\":\"张三\"}" ,可通过构建map对象后再转换成json字符串:JSONObject.toJSONString(map)

服务端:

  Method只支持POST @RequestMapping(method = {RequestMethod.POST})
   方法参数可以对象构成:加@RequestBody 注解前缀,否则不能接收到
   文件上传可以通过转换成base64参数
    @RequestMapping(value = "/testJson", method = {RequestMethod.POST})
    @ApiOperation("Content-type:application/json, 只支持POST,请求参数可以是对象,List,Map,如有上传文件,需转换成Base64字符串 ")
    @ApiResponses(value={@ApiResponse(code = 200, message = "请求成功")})
    public Result testJson(@RequestBody IdcardRequestDto idcardRequestDto){

        log.info("name:{}, idcard:{}, file: {}", idcardRequestDto.getName(), idcardRequestDto.getIdcard(), idcardRequestDto.getFile());
        return ResultUtil.success();
    }

### 3. multipart/form-data
当请求参数有上传文件,3个及以下请求参数,只支持POST请求,客户端设置请求头参数:“Content-type: multipart/form-data”:

    @RequestMapping(value = "/testMutipartParamForm", method = {RequestMethod.POST})
    @ApiOperation("Content-type:application/x-www-form-urlencoded, 只支持POST,多个请求参数,有上传文件 ")
    @ApiResponses(value={@ApiResponse(code = 200, message = "请求成功")})
    public Result testMutipartParamForm(String name, String idcard, MultipartFile file){

        log.info("name:{}, idcard:{}, file: {}", name, idcard, file);

        return ResultUtil.success();
    }

当请求参数有上传文件,3个以上请求参数,封装成请求对象,不能加@RequestBody注解,只支持POST请求,客户端设置请求头参数:“Content-type: multipart/form-data”

    @RequestMapping(value = "/testMutipartObjForm", method = {RequestMethod.POST})
    @ApiOperation("Content-type:application/x-www-form-urlencoded, 只支持POST,封装请求参数对象,有上传文件 ")
    @ApiResponses(value={@ApiResponse(code = 200, message = "请求成功")})
    public Result testMutipartObjForm(IdcardRequestDto idcardRequestDto){

        log.info("name:{}, idcard:{}, file: {}", idcardRequestDto.getName(), idcardRequestDto.getIdcard(), idcardRequestDto.getFile());

        return ResultUtil.success();
    }

更多技术资源、软件开发工具,欢迎访问【昂焱数据】,这里一定有惊喜等着你!

目录
相关文章
|
11天前
|
Rust 前端开发 API
Tauri 开发实践 — Tauri HTTP 请求开发
本文介绍了如何在 Tauri 中发起 HTTP 请求。首先通过安装 Tauri 生态中的工具包并配置 `tauri.conf.json` 文件来允许特定域名的 HTTP 通信。接着封装了一个简单的 HTTP 客户端类,并在页面中使用该客户端实现 GET 和 POST 请求。最后提供了完整的源码地址以供参考。此功能使得桌面应用能够与远程服务器进行交互,增强了应用的实用性。
41 1
Tauri 开发实践 — Tauri HTTP 请求开发
|
16天前
|
缓存 网络协议 JavaScript
【HTTP】构造HTTP请求和状态码
【HTTP】构造HTTP请求和状态码
39 1
【HTTP】构造HTTP请求和状态码
|
16天前
|
存储 Java 程序员
【HTTP】请求“报头”,Referer 和 Cookie
【HTTP】请求“报头”,Referer 和 Cookie
29 1
【HTTP】请求“报头”,Referer 和 Cookie
|
12天前
|
存储 JSON API
HTTP 请求与响应处理:C#中的实践
【10月更文挑战第4天】在现代Web开发中,HTTP协议至关重要,无论构建Web应用还是API开发,都需要熟练掌握HTTP请求与响应处理。本文从C#角度出发,介绍HTTP基础知识,包括请求与响应结构,并通过`HttpClient`库演示如何发送GET请求及处理响应,同时分析常见错误并提供解决方案,助你更高效地完成HTTP相关任务。
58 2
|
16天前
|
JSON 缓存 JavaScript
【HTTP】请求“报头”(Host、Content-Length/Content-Type、User-Agent(简称 UA))
【HTTP】请求“报头”(Host、Content-Length/Content-Type、User-Agent(简称 UA))
56 1
|
18天前
|
缓存 移动开发 前端开发
HTTP请求走私漏洞原理与利用手段分析
HTTP请求走私漏洞原理与利用手段分析
22 1
|
14天前
|
SQL JSON 缓存
你了解 SpringBoot 在一次 http 请求中耗费了多少内存吗?
在工作中常需进行全链路压测并优化JVM参数。通过实验可精确计算特定并发下所需的堆内存,并结合JVM新生代大小估算GC频率,进而优化系统。实验基于SpringBoot应用,利用JMeter模拟并发请求,分析GC日志得出:单次HTTP请求平均消耗约34KB堆内存。复杂环境下,如公司线上环境,单次RPC请求内存消耗可达0.5MB至1MB,揭示了高并发场景下的内存管理挑战。
|
15天前
|
Linux 开发工具 C语言
【c++】c++发送http请求
【c++】c++发送http请求
|
18天前
|
API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
使用`System.Net.WebClient`类发送HTTP请求来调用阿里云短信API
15 0
|
18天前
|
安全 网络安全 数据安全/隐私保护
HTTPS 请求中的证书验证详解(Python版)
HTTPS 请求中的证书验证详解(Python版)
38 0