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

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

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

目录
相关文章
|
17天前
|
数据采集
Haskell爬虫:连接管理与HTTP请求性能
Haskell爬虫:连接管理与HTTP请求性能
|
24天前
|
JSON 安全 前端开发
类型安全的 Go HTTP 请求
类型安全的 Go HTTP 请求
|
23天前
|
数据采集 JSON API
异步方法与HTTP请求:.NET中提高响应速度的实用技巧
本文探讨了在.NET环境下,如何通过异步方法和HTTP请求提高Web爬虫的响应速度和数据抓取效率。介绍了使用HttpClient结合async和await关键字实现异步HTTP请求,避免阻塞主线程,并通过设置代理IP、user-agent和cookie来优化爬虫性能。提供了代码示例,演示了如何集成这些技术以绕过目标网站的反爬机制,实现高效的数据抓取。最后,通过实例展示了如何应用这些技术获取API的JSON数据,强调了这些方法在提升爬虫性能和可靠性方面的重要性。
异步方法与HTTP请求:.NET中提高响应速度的实用技巧
|
9天前
|
JSON JavaScript 前端开发
Haskell中的数据交换:通过http-conduit发送JSON请求
Haskell中的数据交换:通过http-conduit发送JSON请求
|
11天前
|
JSON API 开发者
Python网络编程新纪元:urllib与requests库,让你的HTTP请求无所不能
【9月更文挑战第9天】随着互联网的发展,网络编程成为现代软件开发的关键部分。Python凭借简洁、易读及强大的特性,在该领域展现出独特魅力。本文介绍了Python标准库中的`urllib`和第三方库`requests`在处理HTTP请求方面的优势。`urllib`虽API底层但功能全面,适用于深入控制HTTP请求;而`requests`则以简洁的API和人性化设计著称,使HTTP请求变得简单高效。两者互补共存,共同推动Python网络编程进入全新纪元,无论初学者还是资深开发者都能从中受益。
30 7
|
9天前
|
开发者
HTTP状态码是由网页服务器返回的三位数字响应代码,用于表示请求的处理结果和状态
HTTP状态码是由网页服务器返回的三位数字响应代码,用于表示请求的处理结果和状态
16 1
|
20天前
|
缓存 网络协议 安全
揭秘浏览器背后的神秘之旅:一网打尽HTTP请求流程,让你网络冲浪更顺畅!
【8月更文挑战第31天】当在浏览器中输入网址并按下回车键时,一系列复杂的HTTP请求流程随即启动。此流程始于DNS解析,将域名转化为IP地址;接着是与服务器的TCP三次握手建立连接。连接建立后,浏览器发送HTTP请求,其中包含请求方法、资源及版本等信息。服务器接收请求并处理后返回HTTP响应,包括状态码、描述及页面内容。浏览器解析响应,若状态码为200则渲染页面,否则显示错误页。整个流程还包括缓存处理和HTTPS加密等步骤,以提升效率和保障安全。理解该流程有助于更高效地利用网络资源。通过抓包工具如Wireshark,我们能更直观地观察和学习这一过程。
33 4
|
19天前
|
JSON 监控 API
http 请求系列
XMLHttpRequest(XHR)是一种用于在客户端和服务器之间进行异步HTTP请求的API,广泛应用于动态更新网页内容,无需重新加载整个页面。本文提供了多个官方学习资源,包括MDN Web Docs、WhatWG和W3C的规范文档,涵盖属性、方法、事件及示例代码。XHR的主要应用场景包括动态内容更新、异步表单提交、局部数据刷新等,具有广泛的支持和灵活性,但也存在处理异步请求的复杂性等问题。最佳实践包括使用异步请求、处理请求状态变化、设置请求头、处理错误和超时等。这些资源和实践将帮助你更好地理解和使用XHR。
20 1
|
1月前
|
JSON API 数据格式
Python网络编程:HTTP请求(requests模块)
在现代编程中,HTTP请求几乎无处不在。无论是数据抓取、API调用还是与远程服务器进行交互,HTTP请求都是不可或缺的一部分。在Python中,requests模块被广泛认为是发送HTTP请求的最简便和强大的工具之一。本文将详细介绍requests模块的功能,并通过一个综合示例展示其应用。
|
1月前
|
Web App开发 缓存 JSON
在打开网站时,HTTP请求流程是如何处理的
【8月更文挑战第20天】流程包括:构建请求(如`GET /index.html HTTP/1.1`)、检查本地缓存、获取服务器IP及端口、等待TCP连接队列、建立TCP连接、发送HTTP请求。服务器处理后返回数据与响应头,可选择保持连接开启以便后续请求重用,最后断开TCP连接。