web入门-HTTP协议及请求参数和统一响应格式

web入门-HTTP协议及请求参数和统一响应格式

码农世界 2024-05-15 前端 61 次浏览 0个评论

Web入门

1.HTTP-请求数据格式

1.1请求行

  • 请求数据第一行(请求方式,资源路径,协议)

    1.2请求头

    • 第二行开始,格式key:value

      Host:请求得主机名

      User-Agent:浏览器版本,例如chrome浏览器得标识Mozilla/5.0 …Chrome/79,IE浏览器的标识类似Mozilla/5.0(WindowsNT…)like Gecko

      Accept:表示浏览器能接收的资源类型,如text/*,image/或者/*表示所有;

      Accept-Language:表示浏览器偏好的语言,服务器可以据此返回不同语言的网页;

      Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip,deflate等。

      Content-Type:请求主体的数据类型

      Content-Length:请求主题的大小(单位:字节)。

      1.3请求体

      • 请求方式-GET:请求参数在请求行中,没有请求体,如:/brand/findAll?name=OPPO$status=1。GET请求大小是有限制的。
      • 请求方式-POST:请求参数在请求体中,POST请求大小是没有限制的。

        2.HTTP-响应格式

        2.1响应行

        • 响应数据第一行(协议,状态码,描述)

          • 状态码大类:

            ​ 1xx:响应中-临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它。

            ​ 2xx:成功-表示请求已经被成功接收,处理已完成。

            ​ 3xx:重定向-重定向到其他地方;让客户端再发起一次请求以完成整个处理。

            ​ 4xx:客户端错误-处理发生错误,责任在客户端。如:请求了不存在的资源,客户端未被授权,禁止访问等。

            ​ 5xx:服务端错误-处理发生错误,责任在服务端。如:程序抛出异常。

          • 常见状态码

            状态码英文描述解释
            200OK客户端请求成功,即处理成功,这是我们最想看到的状态码
            302Found指示所请求的资源已移动到由Location响应头给定的 URL,浏览器会自动重新访问到这个页面
            304Not Modified告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向
            400Bad Request客户端请求有语法错误,不能被服务器所理解
            403Forbidden服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源
            404Not Found请求资源不存在,一般是URL输入有误,或者网站资源被删除了
            405Method Not Allowed请求方式有误,比如应该用GET请求方式的资源,用了POST
            428Precondition Required服务器要求有条件的请求,告诉客户端要想访问该资源,必须携带特定的请求头
            429Too Many Requests指示用户在给定时间内发送了太多请求(“限速”),配合 Retry-After(多长时间后可以请求)响应头一起使用
            431 Request Header Fields Too Large请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后重新提交。
            500Internal Server Error服务器发生不可预期的错误。服务器出异常了,赶紧看日志去吧
            503Service Unavailable服务器尚未准备好处理请求,服务器刚刚启动,还未初始化好

            状态码大全:https://cloud.tencent.com/developer/chapter/13553

            2.2响应头

            • 第二行开始,格式key:value

              ​ Content-type:表示该响应内容的类型,例如text/html,application/json。

              ​ Content-Length:表示该响应内容的长度(字节数)

              ​ Content-Encoding:表示该响应压缩算法,例如gzip。

              ​ Cache-Control:表示客户端应如何缓存,例如max-age=300表示最多可以缓存300秒。

              ​ Set-Cookie:告诉浏览器为当前页面所在的域设置cookie。

              2.3响应体

              • 最后一部分,存放响应数据

                3.请求参数及请求格式

                3.1概述

                • 请求:(HttpServletRequest):获取请求数据
                • 响应:(HttpServletResponse):设置响应数据
                • BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器。
                • CS架构:Client/Server,客户端/服务器

                  3.2简单参数

                  1. 原始方式获取请求参数
                    • Controller方法形参中声明HttpServletRequest对象
                    • 调用对象的getParameter(参数名)
                    • SpringBoot中接收简单参数
                      • 请求参数名与方法形参变量名相同
                      • 会自动进行类型转换
                      • @RequestParam注解
                        • 方法形参名称与请求参数名不匹配,通过该注解完成映射
                        • 该注解的required属性默认是true,代表请求参数必须传递
                  • 原始方式

                       //原始方式
                        @RequestMapping("/simpleParam")
                        public String simpleParam(HttpServletRequest request) {
                            String name = request.getParameter("name");
                            String ageStr = request.getParameter("age");
                            int age = Integer.parseInt(ageStr);
                            System.out.println(name + ":" + age);
                            return "ok";
                        }
                    
                  • springboot方式

                    • 参数名与形参变量相同,定义形参即可接受参数
                      //springboot方式
                      @RequestMapping("/simpleParam")
                      public String simpleParam(String name ,Integer age) {
                          System.out.println(name + ":" + age);
                          return "ok";
                      }
                      
                      • 如果方法形参名称与请求参数名称不匹配,可以使用@RequestParam完成映射。
                        //springboot方式
                        @RequestMapping("/simpleParam")
                        public String simpleParam(@RequestParam(name = "name") String username , Integer age) {
                            System.out.println(username + ":" + age);
                            return "ok";
                        }
                        
                        • @RequestParam中的required属性默认为true,代表该请求参数必须传递,如果不传递将报错。如果参数是可选的,可以将required属性设置为false
                          //springboot方式
                          @RequestMapping("/simpleParam")
                          public String simpleParam(@RequestParam(name = "name",required = false) String username , Integer age) {
                              System.out.println(username + ":" + age);
                              return "ok";
                          }
                          

                          3.3简单实体参数

                          //简单实体参数
                          @RequestMapping("/simplePojo")
                          public String simplePojo(User user) {
                              System.out.println(user);
                              System.out.println(user.getName() + ":" + user.getAge());
                              return "ok";
                          }
                          
                          package com.itheima.springbootwebquickstart.pojo;
                          import lombok.AllArgsConstructor;
                          import lombok.Data;
                          import lombok.NoArgsConstructor;
                          /**
                           * ClassName: User
                           * Package: com.itheima.springbootwebquickstart.pojo
                           * Description:
                           * 

                          * {@code @Author} 段 * {@code @Create} 2024/5/13 10:58 * {@code @Version} 1.0 */ @Data @AllArgsConstructor @NoArgsConstructor public class User { private String name; private Integer age; }

                          3.4复杂实体参数

                          package com.itheima.springbootwebquickstart.pojo;
                          import lombok.AllArgsConstructor;
                          import lombok.Data;
                          import lombok.NoArgsConstructor;
                          /**
                           * ClassName: User
                           * Package: com.itheima.springbootwebquickstart.pojo
                           * Description:
                           * 

                          * {@code @Author} 段 * {@code @Create} 2024/5/13 10:58 * {@code @Version} 1.0 */ @Data @AllArgsConstructor @NoArgsConstructor public class User { private String name; private Integer age; private Address address; }

                          package com.itheima.springbootwebquickstart.pojo;
                          import lombok.AllArgsConstructor;
                          import lombok.Data;
                          import lombok.NoArgsConstructor;
                          /**
                           * ClassName: Address
                           * Package: com.itheima.springbootwebquickstart.pojo
                           * Description:
                           * 

                          * {@code @Author} 段 * {@code @Create} 2024/5/13 11:05 * {@code @Version} 1.0 */ @Data @AllArgsConstructor @NoArgsConstructor public class Address { private String province; private String city; }

                          //复杂实体参数
                          @RequestMapping("/complexPojo")
                          public String complexPojo(User user) {
                              System.out.println(user);
                              System.out.println(user.getName() + ":" + user.getAge() + ":"
                                      + user.getAddress().getProvince() + ":" + user.getAddress().getCity());
                              return "ok";
                          }
                          

                          注:

                          @Data:该注解是lombok插件提供的,作用是生成标注类的所有get/ser方法

                          @AllArgsConstructor:该注解是lombok插件提供的,作用是生成标注类的所有带参构造

                          @NoArgsConstructor:该注解是lombok插件提供的,作用是生成标注类的空参构造

                          3.5数组集合参数

                          3.5.1数组参数
                          //数组集合参数
                          @RequestMapping("/arrayParam")
                          public String arrayParam(String[] hobby) {
                              System.out.println(Arrays.toString(hobby));
                              return "ok";
                          }
                          
                          3.5.2集合参数
                          • 集合参数:请求参数名与形参集合名称相同且请求参数为多个,@RequestParam绑定参数关系
                            //集合参数
                            @RequestMapping("/listParam")
                            public String listParam(@RequestParam List hobby) {
                                System.out.println(hobby);
                                return "ok";
                            }
                            

                            3.6日期参数

                            • 日期参数:使用@DateFormat注解完成日期参数格式转换(该注解用于指定前端传递的参数格式)
                              //日期参数
                              @RequestMapping("/dateParam")
                              public String dateParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime) {
                                  System.out.println(updateTime);
                                  return "ok";
                              }
                              

                              3.7Json参数

                              • JSON参数:JSON数据键名与形参对象属性名相同,定义POJO类型形参即可接收参数,需要使用@RequestBody标识(该注解将JSON格式的参数封装到对应的实体类中)
                                //json格式参数
                                @PostMapping("/jsonParam")	//注意,JSON参数是存放在请求体当中的,此时应使用Post请求方式
                                public String jsonParam(@RequestBody User user) {
                                    System.out.println(user);
                                    return "ok";
                                }
                                

                                3.8路径参数

                                • 路径参数:通过请求url直接传递参数,使用{…}来标识该路径参数,需要使用@PathVariable获取路径参数并将该路径参数绑定给形参(路径参数名称应和形参名称一致)
                                  3.8.1单个路径参数
                                  //路径参数
                                  @RequestMapping("/pathParam/{id}")
                                  public String pathParam(@PathVariable Integer id) {
                                      System.out.println(id);
                                      return "ok";
                                  }
                                  
                                  3.8.2多个路径参数
                                  //多个个路径参数
                                  @RequestMapping("/pathParam/{id}/{name}")
                                  public String pathParam2(@PathVariable Integer id,@PathVariable String name) {
                                      System.out.println(name + ":" + id);
                                      return "ok";
                                  }
                                  

                                  4.响应数据及响应格式

                                  ​ @ResponseBody

                                  • 类型:方法注解,类注解
                                  • 位置:Controller方法上/类上
                                  • 作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合,将会转换为JSON格式响应
                                  • 说明:@RestController = @Controller + @ResponseBody;

                                    统一响应结果

                                    package com.itheima.springbootwebquickstart.pojo;
                                    /**
                                     * ClassName: Result
                                     * Package: com.itheima.springbootwebquickstart.pojo
                                     * Description:统一响应结果封装类
                                     * 

                                    * {@code @Author} 段 * {@code @Create} 2024/5/13 15:45 * {@code @Version} 1.0 */ public class Result { private Integer code; //1 成功 , 0 失败 private String msg; //提示信息 private Object data; //数据 data public Result() { } public Result(Integer code, String msg, Object data) { this.code = code; this.msg = msg; this.data = data; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } public static Result success(Object data) { return new Result(1,"success",data); } public static Result success() { return new Result(1,"success",null); } public static Result error(String msg) { return new Result(1,msg,null); } @Override public String toString() { return "Result{" + "code=" + code + ", msg='" + msg + '\'' + ", data=" + data + '}'; } }

转载请注明来自码农世界,本文标题:《web入门-HTTP协议及请求参数和统一响应格式》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,61人围观)参与讨论

还没有评论,来说两句吧...

Top