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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 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();
    }

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

目录
相关文章
|
4天前
|
缓存 应用服务中间件 Apache
HTTP 范围Range请求
HTTP范围请求是一种强大的技术,允许客户端请求资源的部分内容,提高了传输效率和用户体验。通过正确配置服务器和实现范围请求,可以在视频流、断点续传下载等场景中发挥重要作用。希望本文提供的详细介绍和示例代码能帮助您更好地理解和应用这一技术。
41 19
|
30天前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
85 25
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
|
12天前
|
JSON JavaScript 前端开发
什么是HTTP POST请求?初学者指南与示范
HTTP POST请求是一种常用的HTTP方法,主要用于向服务器发送数据。通过合理设置请求头和请求主体,可以实现数据的可靠传输。无论是在客户端使用JavaScript,还是在服务器端使用Node.js,理解和掌握POST请求的工作原理和应用场景,对于Web开发至关重要。
133 18
|
12天前
|
JSON 数据格式
.net HTTP请求类封装
`HttpRequestHelper` 是一个用于简化 HTTP 请求的辅助类,支持发送 GET 和 POST 请求。它使用 `HttpClient` 发起请求,并通过 `Newtonsoft.Json` 处理 JSON 数据。示例展示了如何使用该类发送请求并处理响应。注意事项包括:简单的错误处理、需安装 `Newtonsoft.Json` 依赖,以及建议重用 `HttpClient` 实例以优化性能。
54 2
|
29天前
|
Web App开发 大数据 应用服务中间件
什么是 HTTP Range请求(范围请求)
HTTP Range 请求是一种非常有用的 HTTP 功能,允许客户端请求资源的特定部分,从而提高传输效率和用户体验。通过合理使用 Range 请求,可以实现断点续传、视频流播放和按需加载等功能。了解并掌握 HTTP Range 请求的工作原理和应用场景,对开发高效的网络应用至关重要。
65 15
|
1月前
|
数据采集 JSON 测试技术
Grequests,非常 Nice 的 Python 异步 HTTP 请求神器
在Python开发中,处理HTTP请求至关重要。`grequests`库基于`requests`,支持异步请求,通过`gevent`实现并发,提高性能。本文介绍了`grequests`的安装、基本与高级功能,如GET/POST请求、并发控制等,并探讨其在实际项目中的应用。
44 3
|
2月前
|
前端开发 UED 开发者
CSS Sprites和图标字体在网页图标加载优化中的应用。CSS Sprites通过合并多图标减少HTTP请求,提升加载速度
本文探讨了CSS Sprites和图标字体在网页图标加载优化中的应用。CSS Sprites通过合并多图标减少HTTP请求,提升加载速度;图标字体则以字体形式呈现图标,便于调整样式。文章分析了两者的优缺点及应用场景,并提供了应用技巧和注意事项,旨在帮助开发者提升页面性能,改善用户体验。
33 5
|
2月前
|
JSON API 数据格式
Python中获取HTTP请求响应体的详解
本文介绍了如何使用Python的`requests`和`urllib`库发送HTTP请求并处理响应体。`requests`库简化了HTTP请求过程,适合快速开发;`urllib`库则更为底层,适用于性能要求较高的场景。文章详细演示了发送GET请求、处理JSON响应等常见操作。
53 3
|
2月前
|
安全 API 网络安全
使用OkHttp进行HTTPS请求的Kotlin实现
使用OkHttp进行HTTPS请求的Kotlin实现
|
30天前
|
Web App开发 网络安全 数据安全/隐私保护
Lua中实现HTTP请求的User-Agent自定义
Lua中实现HTTP请求的User-Agent自定义