GET,POST与后端接口详记

前言

HTTP通信的7种方式

在HTTP通信中主要分为GET和POST。如PUT,DELETE是类POST的传输方式,与POST没有实质区别。OPTION是查看服务器支持的请求方法。HEAD是测试服务器的该资源情况,不返回实体的主体部分。TRACE请求可以获取回服务器接收到的该请求的原始报文,从而判断路径中的代理和防火墙是否对该条请求进行修改。

HTTP请求报文发送格式不因请求方式不同而改变

  1. HTTP报文格式如下
<请求方法> <请求路径> <协议版本>
<请求头>

<主体body>
  1. 无论用任何请求方法,都可以发送这样的请求报文,报文结构是HTTP的协议规范,请求方法只是告诉服务器如何来看待这条请求。因为在有些文章中会提到GET请求不能传body数据,而真实的情况是有些服务端框架接收到GET请求后会自动将GET请求的body部分丢弃,所以大家要注意。所以为了规范,大家在使用GET请求时还是不要将请求数据放在body中。

何时用GET请求

为了规范,使用GET请求时就不要在主体body中放数据了,避免不必要的错误。所以请求中的数据是放在URL上的。

  1. 浏览器网址栏和页面跳转。
  2. 为了获取信息且不需要传大量条件信息的接口。

例如用GET做登录请求

GET /online/test/?name=haha&amp; password=miaomiao HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
Postman-Token: 14a1347a-c540-48f0-9d49-6299f86c3a73

何时用POST请求

post请求可以在body中传送大量信息

以上传name=haha,password=miaomiao为例,查看不同body数据格式

form-data(表单,可以传文件)

POST /online/test/? HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
cache-control: no-cache
Postman-Token: c6e21725-caec-4a40-841c-7b92f87f6999

Content-Disposition: form-data; name="name"

haha

Content-Disposition: form-data; name="password"

miaomiao
------WebKitFormBoundary7MA4YWxkTrZu0gW--

若在表单中附加一张图片

POST /online/test/? HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
cache-control: no-cache
Postman-Token: 437207ba-e007-4de8-bbcd-bdc88db6e445

Content-Disposition: form-data; name="name"

haha

Content-Disposition: form-data; name="password"

miaomiao

Content-Disposition: form-data; name="profile"; filename="C:\Users\Think\Pictures\profile.jpg


------WebKitFormBoundary7MA4YWxkTrZu0gW--
  1. 其中表单的每一项都有Content-Disposition描述。
  2. ——WebKitFormBoundary7MA4YWxkTrZu0gW–是随机生成的分隔标记

x-www-form-urlencoded(也是表单,但不可以传文件)

POST /online/test/? HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
Postman-Token: 35566466-0568-4731-9c1c-6eda7dfca105
name=hahapassword=miaomiaoundefined=undefined
  1. 因为不用传文件,所以不用单独描述,将表单信息拼凑在一起就可以了。
  2. application/x-www-form-urlencoded: 窗体数据被编码为名称/值对。这是标准的编码格式。
  3. multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。

raw(text,json,xml…)(其它文本格式)

以json格式为例

POST /online/test/? HTTP/1.1
Host: 127.0.0.1:8080
Content-Type: application/json
cache-control: no-cache
Postman-Token: 06a9f071-4424-428a-b17b-9b4fe6f209a2
{
    "name":"haha",
    "password":"miaomiao"
}------WebKitFormBoundary7MA4YWxkTrZu0gW--

binary(二进制)

用作传输文件,包括前面的form-data上传文件,文件都是以一定的编码方式写在body中的,在服务器端获取该请求的输入流后,即可按行接收流中的数据信息。

在Spring Boot中接口的接收数据总结

URL接收

GET参数列表对于数字基本类型和包装类型都可接收,但是若前端并没传这个数字,那么包装类型可以在代码里判空,异常处理就好,但是基本类型是不能判空的,所以对于数字首选包装类型。

    @RequestMapping(value = "/",method = RequestMethod.GET)
    @ResponseBody
    private ResInfo test(String name,String password){

        return new ResInfo(200,"登录成功: "+name+" "+password);
    }

PostMan接收

{
    "code": 200,
    "msg": "登录成功: haha miaomiao"
}

表单数据

两种表单的请求Java接口都可以这样写。

    @RequestMapping(value = "/",method = RequestMethod.POST)
    @ResponseBody
    private ResInfo test(String name,String password){

        return new ResInfo(200,"登录成功: "+name+" "+password);

    }

若表单中要上传文件,则文件项该用注解写名称,参数名都可用@RequestParam替代。只有form-data可以接收文件。

    @RequestMapping(value = "/",method = RequestMethod.POST)
    @ResponseBody
    private ResInfo test(String name,String password,@RequestParam("profile") MultipartFile multipartFile){

        String fileName = multipartFile.getOriginalFilename();
        return new ResInfo(200,"登录成功: "+name+" "+password+"文件名:"+fileName);

    }

Postman响应

{
    "code": 200,
    "msg": "登录成功: haha miaomiao文件名:profile.jpg"
}

接收json对象

    class User   {
        public String name;
        public String password;

        public User() {

        }
       //若重写了构造方法,一定要写上空构造方法,否则spring不能new新对象以接收json
        public User(String name, String password) {
            this.name = name;
            this.password = password;
        }
    }
    @RequestMapping(value = "/", method = RequestMethod.POST)
    @ResponseBody
    private ResInfo test(@RequestBody User user) {

        return new ResInfo(200, "登录成功: " + user.name + " " + user.password);
    }

Postman响应

{
    "code": 200,
    "msg": "登录成功: haha miaomiao"
}

json对象和单个值混合接收

思想:把json对象放在body中,把单个值放在url参数列表中,所以构造请求时url和body两部分都要构造。

@RequestMapping(value = "/", method = RequestMethod.POST)
    @ResponseBody
    private ResInfo test(@RequestBody User user, String msg) {

        return new ResInfo(200, "登录成功: " + user.name + " " + user.password +
                "msg:" + msg);
    }

Postman响应

{
    "code": 200,
    "msg": "登录成功: haha miaomiaomsg:hello, my name is msg !"
}

至此完成了从HTTP构造到spring对接口解析的总结与梳理,欢迎大家指正。

    原文作者:赵栩彬
    原文地址: https://segmentfault.com/a/1190000019643417
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞