前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >浅析http请求的content-type及使用场景

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

原创
作者头像
用户8236825
发布于 2023-03-26 16:01:37
发布于 2023-03-26 16:01:37
1.8K0
举报
文章被收录于专栏:接口API接口API

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

客户端:

代码语言:txt
AI代码解释
复制
  header:Content-Type=application/x-www-form-urlencoded
代码语言:txt
AI代码解释
复制
  Method:get方法-参数需要做URLEncode
代码语言:txt
AI代码解释
复制
  Post方法-构建nameValuePairList列表放入UrlEncodedFormEntity
代码语言:java
AI代码解释
复制
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);

服务端:

代码语言:txt
AI代码解释
复制
  请求参数不含MultlpartFile类型时可同时支持 GET和POST,具体请参考以下规范:
代码语言:txt
AI代码解释
复制
     controller方法注解@RequestMapping(method = {RequestMethod.POST, RequestMethod.GET})
代码语言:txt
AI代码解释
复制
  上传文件:只支持POST(包括MutipleFile和Base64字符串)
代码语言:txt
AI代码解释
复制
  方法参数可以对象构成:不能加@RequestBody注解,否则不能接收到
代码语言:java
AI代码解释
复制
    @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个以上,可以封装成请求参数对象:

代码语言:java
AI代码解释
复制
    @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

客户端:

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

服务端:

代码语言:txt
AI代码解释
复制
  Method只支持POST @RequestMapping(method = {RequestMethod.POST})
代码语言:txt
AI代码解释
复制
   方法参数可以对象构成:加@RequestBody 注解前缀,否则不能接收到
代码语言:txt
AI代码解释
复制
   文件上传可以通过转换成base64参数
代码语言:java
AI代码解释
复制
    @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”:

代码语言:java
AI代码解释
复制
    @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”

代码语言:java
AI代码解释
复制
    @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();
    }

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
深入了解服务网格数据平面性能和调优
彭磊,陈凌鹏,腾讯云高级软件工程师,目前负责TCM服务网格产品,致力于打造云原生服务网格。
腾讯云原生
2020/08/25
1.9K1
【译文连载】 理解Istio服务网格(第六章 可观测性)
微服务架构管理中最大的挑战之一是如何通过简单方法就能了解系统各个组件之间的关系。终端用户的一次会话可能会流经多个甚至几十个独立部署的微服务,因此,发现哪里有性能瓶颈或错误变得尤为重要。
SammyLiu
2020/03/11
9170
Istio服务网格的可观察性
前面我们学习了 Istio 中的流量管理功能,本节我们来学习如何配置 Istio来自动收集网格中的服务遥测。Istio为网格内所有的服务通信生成详细的遥测数据,这种遥测技术提供了服务的可观察性,使运维人员能够排查故障、维护和优化应用程序,而不会给服务的开发人员带来任何额外的负担。通过 Istio,运维人员可以全面了解到受监控的服务如何与其他服务以及Istio组件进行交互。
王先森sec
2023/04/24
9230
Istio服务网格的可观察性
《istio实战指南》第2章 Istio入门
第2章 Istio入门 ---- 什么是Istio 它是一个完全开源的服务网格,以透明层的方式构建在现有分布式应用中。它也是一个提供了各种API的平台,可以与任何日志平台、监控系统或策略系统集成。Istio的多样化特性可以让你高效地运行分布式微服务架构,并提供一种统一的方式来保护、连接和监控微服务 Istio为微服务应用提供了一个完整的解决方案,可以以统一的方式去检测和管理微服务。同时,它还提供了管理流量、实施访问策略、收集数据等功能,而所有这些功能都对业务代码透明,即不需要修改业务代码就能实现 有了Ist
yeedomliu
2020/07/14
1.7K0
《istio实战指南》第2章 Istio入门
Istio系列三:Mixer、Pilot组件分析实践
本文为Istio系列的终结篇,前两篇《Istio系列一:Istio的认证授权机制分析》、《Istio系列二:Envoy组件分析》笔者分别对Istio的安全机制和数据平面组件Envoy进行了解读,相信各位读者已经对Istio有了一定认识,本文主要对Istio的控制平面核心组件Mixer、Pilot进行分析解读,在文中笔者会结合Envoy说明Mixer、Pilot的工作原理及它们在Istio中的价值,文章阅读时间大致15分钟,希望能给各位读者带来收获。
绿盟科技研究通讯
2019/12/11
2.4K0
Istio系列三:Mixer、Pilot组件分析实践
实现全托管,腾讯云服务网格的架构演进
|导语 腾讯云服务网格(TCM)作为一个兼容 isito 的服务网格平台,已经在腾讯内外部有诸多落地案例。本文深度解析服务网格架构演进和发展趋势。 一、 istio 现状和发展趋势 1. istio发展现状 istio现在是目前最流行的服务网格实现,它的流行主要体现在两个方面。 一是社区非常的活跃,过去一年,Istio 在 GitHub 增长最快的开源项目排行榜上名列第四。 另一方面 istio 在业界有了越来越多的生产落地。在一项云原生调研报告中,已经有18% 的用户在生产环境中使用mesh 技术,
腾讯大讲堂
2020/10/09
2.2K0
istio部署模型
当配置一个生产级别的Istio时,需要解决一些问题:如网格是单集群使用,还是跨集群使用?所有的服务会放到一个完全可达的网络中,还是需要网关来连接跨网络的服务?使用一个控制面(可能会跨集群共享一个控制面),还是使用多个控制面来实现高可用(HA)?所有的集群都连接到一个多集群服务网格,还是联合成一个多网格形态。
charlieroro
2020/09/08
1.1K0
为微服务引入Istio服务网格(上)
版权说明:本文由高晓雪参照如下文档翻译。魏新宇根据高晓雪的翻译文档,做了适当的注解和文字矫正。 https://developers.redhat.com/download-manager/file/istio_mesh_for_microservices_r1.pdf 本文适合对istio的读者提供泛读参考,对istio理解较深的读者,建议直接阅读英文原文。本系列分上下两篇:上篇为1-3章内容,下篇为4-7章内容。 目录 为微服务引入Istio服务网格 1.介绍 1.1.更快的挑战 1.2.认识Ist
魏新宇
2018/06/25
4.2K0
Istio中的流量配置
Istio的数据面会在pod中注入两个容器:istio-init和istio-proxy。
charlieroro
2020/09/22
2.4K0
Istio中的流量配置
Istio是一个服务网格
   现在,基于这些容器编排提供了很多核心功能,如负载平衡,服务发现和安全性,这就是在基础架构上创建所谓的服务网格。
物流IT圈
2019/07/19
6330
Istio是一个服务网格
以后别人再问你什么是 Istio,就把这篇文章甩给他
从上面的定义中可以了解到,Istio 为微服务应用提供了一个完整的解决方案,可以以统一的方式去检测和管理微服务。同时,它还提供了管理流量、实施访问策略、收集数据等功能,而所有这些功能都对业务代码透明,即不需要修改业务代码就能实现。
米开朗基杨
2019/09/11
8480
以后别人再问你什么是 Istio,就把这篇文章甩给他
Istio 实践手册 |服务网格框架对比
当前,业界主要有以下主要几种 Service Mesh 框架,下面进行详细的说明及对比。
xcbeyond
2021/11/28
1.5K1
Istio 实践手册 |服务网格框架对比
Istio: 服务网格领域的新王者
Istio 是当前 Service Mesh 领域最完善的解决方案,同源自 kubernetes 项目团队。
钟华
2019/02/12
4.4K0
Istio简单介绍
Istio是一个开放平台,提供统一的方式来集成微服务,管理跨微服务的流量,执行策略和汇总遥测数据。Istio的控制面板在底层集群管理平台(如Kubernetes,Mesos等)上提供了一个抽象层
dogfei
2020/07/31
1.8K0
Istio的运维-诊断工具(istio 系列五)
在参考官方文档的时候发现环境偶尔会出现问题,因此插入一章与调试有关的内容,便于简单问题的定位。涵盖官方文档的诊断工具章节
charlieroro
2020/06/11
2.9K0
《云原生服务网格Istio》第2章 Istio架构概述
第2章 Istio架构概述 2.1 Istio的工作机制 分为控制面和数据面两部分。可以看到,控制面主要包括Pilot、Mixer、Citadel等服务组件;数据面由伴随每个应用程序部署的代理程序Envoy组成,执行针对应用程序的治理逻辑 即观察frontend服务对 forecast 服务进行一次访问时,在 Istio 内部都发生了什么,以及 Istio 的各个组件是怎样参与其中的,分别做了哪些事情 虽然从时序上来讲,控制面的配置在前,数据面执行在后,但为了便于理解,在下面介绍这些动作时以数据面上的数据流
yeedomliu
2019/10/11
1.6K0
《云原生服务网格Istio》第2章 Istio架构概述
入门向:Istio 与服务网格
近期,服务网格(Service Mesh)越加流行红火,各类社区讨论也层出不穷。面对如此火热的技术,我们不免有些疑问:服务网格究竟是什么,服务网格解决了什么?本文尝试简单讲解服务网格的架构设计,并介绍其流行解决方案 Istio。
CS实验室
2021/03/22
4460
入门向:Istio 与服务网格
2020 年的 Istio - 顺风而行
翻译 Istio 官网blog文章,原文:https://istio.io/blog/2020/tradewinds-2020/。
黑光技术
2020/05/14
4690
2020 年的 Istio - 顺风而行
【云原生|技术基石】4:速通云原生基石-Istio服务网格
本期文章是介绍云原生技术的基石:Istio服务网格,上次的文章中我们已经学习过了Pod的详细介绍,感兴趣的同学可以去看一下,任意门:【云原生|实战研发】2:Pod的深入实践与理解
程序员洲洲
2024/06/07
1730
【云原生|技术基石】4:速通云原生基石-Istio服务网格
服务网格Istio初探
这个术语通常用于描述构成这些应用程序的微服务网络以及应用之间的交互。随着规模和复杂性的增长,服务网格越来越难以理解和管理。它的需求包括服务发现、负载均衡、故障恢复、指标收集和监控以及通常更加复杂的运维需求,例如 A/B 测试、金丝雀发布、限流、访问控制和端到端认证等。
老梁
2019/08/21
1K0
服务网格Istio初探
推荐阅读
相关推荐
深入了解服务网格数据平面性能和调优
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档