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

简介: 在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();
    }

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

目录
相关文章
|
3月前
|
JSON 监控 API
掌握使用 requests 库发送各种 HTTP 请求和处理 API 响应
本课程全面讲解了使用 Python 的 requests 库进行 API 请求与响应处理,内容涵盖环境搭建、GET 与 POST 请求、参数传递、错误处理、请求头设置及实战项目开发。通过实例教学,学员可掌握基础到高级技巧,并完成天气查询应用等实际项目,适合初学者快速上手网络编程与 API 调用。
500 130
|
6月前
|
JavaScript 前端开发 API
Node.js中发起HTTP请求的五种方式
以上五种方式,尽管只是冰山一角,但已经足以让编写Node.js HTTP请求的你,在连接世界的舞台上演奏出华丽的乐章。从原生的 `http`到现代的 `fetch`,每种方式都有独特的风格和表现力,让你的代码随着项目的节奏自由地舞动。
671 65
|
4月前
HTTP协议中请求方式GET 与 POST 什么区别 ?
GET和POST的主要区别在于参数传递方式、安全性和应用场景。GET通过URL传递参数,长度受限且安全性较低,适合获取数据;而POST通过请求体传递参数,安全性更高,适合提交数据。
565 2
|
5月前
|
Go 定位技术
Golang中设置HTTP请求代理的策略
在实际应用中,可能还需要处理代理服务器的连接稳定性、响应时间、以及错误处理等。因此,建议在使用代理时增加适当的错误重试机制,以确保网络请求的健壮性。此外,由于网络编程涉及的细节较多,彻底测试以确认代理配置符合预期的行为也是十分重要的。
270 8
|
5月前
|
缓存
|
4月前
|
JSON JavaScript API
Python模拟HTTP请求实现APP自动签到
Python模拟HTTP请求实现APP自动签到
|
4月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
5月前
|
缓存 JavaScript 前端开发
Vue 3 HTTP请求封装导致响应结果无法在浏览器中获取,尽管实际请求已成功。
通过逐项检查和调试,最终可以定位问题所在,修复后便能正常在浏览器中获取响应结果。
254 0
|
5月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
425 0
|
7月前
|
Go
在golang中发起http请求以获取访问域名的ip地址实例(使用net, httptrace库)
这只是追踪我们的行程的简单方法,不过希望你跟着探险家的脚步,即使是在互联网的隧道中,也可以找到你想去的地方。接下来就是你的探险之旅了,祝你好运!
406 26

热门文章

最新文章