zoukankan      html  css  js  c++  java
  • 控制层接受参数

    聊一聊控制层

    不管spring还是springboot说起控制层,最容易想起的就是这两个注解

    @Controller 和@RestController

    @RestController 注解,该注解是Spring 4.0引入的。查看源码可知其包含了 @Controller 和 @ResponseBody 注解。我们可以理解为 @Controller的增强版。专门为响应内容式的 Controller 而设计的,可以直接响应对象为JSON。
    而 @Controller 用来响应页面,spring-boot 支持多种模版引擎包括:
    1,FreeMarker
    2,Groovy
    3,Thymeleaf (Spring 官网使用这个)
    4,Velocity
    5,JSP (貌似Spring Boot官方不推荐,STS创建的项目会在src/main/resources 下有个templates 目录,这里就是让我们放模版文件的,然后并没有生成诸如 SpringMVC 中的webapp目录)

    - - -

    关于Controller 方法可以接收参数使用@RequestBody、@RequestParam、@ModelAttribute、JSONObject、HttpEntity 等方式

    1. requestParam

    这个最简单,也就是传递参数值

    如:

       @RequestMapping("/info")
        public Map<String, String> getInfo(@RequestParam String name) {
            Map<String, String> map = new HashMap<>();
            map.put("nameIs", name);
            return map;
        }

    注:如果参数前写了@RequestParam(xxx),那么前端必须有对应的xxx名字才行(不管其是否有值,当然可以通
           过设置该注解的required属性来调节是否必须传),如果没有xxx名的话,那么请求会出错,报400。

    2 . RequestBody

    @RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。

    a、@requestBody注解。一般情况下来说常用其来处理application/json类型。

    b、通过@requestBody可以将请求体中的JSON字符串绑定到相应的bean上,当然,也可以将其分别绑定到对应的字符串上。

    详情参考https://blog.csdn.net/justry_deng/article/details/80972817

    3.@ModelAttribute

    被@ModelAttribute注释的方法会在此controller每个方法执行前被执行,因此对于一个controller映射多个URL的用法来说,要谨慎使用

    a. 用在方法上

        一个控制器可以拥有多个@ModelAttribute方法。同个控制器内的所有这些方法,都会在@RequestMapping方法之前被调用。

            1) 方法通过返回值的方式默认地将添加一个属性;

            2) 方法接收一个Model对象,然后可以向其中添加任意数量的属性。

    b. 用在方法参数上

        标注在方法参数上的@ModelAttribute说明了该方法参数的值将由model中取得。如果model中找不到,那么该参数会先被实例化,然后被添加到model中。在model中存在以后,请求中所有名称匹配的参数都会填充到该参数中。

            1) 它可能因为@SessionAttributes标注的使用已经存在于model中。

            2) 它可能因为在同个控制器中使用了@ModelAttribute方法已经存在于model中。

            3) 它可能是由URI模板变量和类型转换中取得的。

            4) 它可能是调用了自身的默认构造器被实例化出来的。

    4.JSONObject
    JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包。
     
     
    5.HttpEntity 
    HttpEntity类是一个本身很简单的类。
    HttpEntity相当于一个消息实体,内容是http传送的报文(这里可以说是html,css等等文件)。这里只需要知道它是用来表征一个http报文的实体就行了,用来发送或接收。

    按HttpEntity内容的来源,它可以分为三类:

    1.streamed(流式):从一个流传输中获得,一般是来自http连接。特点:使用时产生,不可重复

    2.self-contained(自包含):存储在内存中的,独立于http连接。特点:可以重复

    3.wrapping(代理,包装):从其他HttpEntity中获得。特点:依附于获取的类

    在HttpEntity帮助文档中建议,将实时性的不可重复的作为流式实体处理,把可重复的(如果不会产生巨大影响)作为自我包含实体处理。

    而一般使用HttpEntity时,都是将它转化为json

    如在使用java + httpClient施行API自动化时

    1. 用Http Response数据做断言;

    2. 用上一个请求的Response内容,作为下一个请求的参数;

    借助fastjson

    1. 以一个Post请求为例,代码如下:

     public CloseableHttpResponse post(String url , String entityString , HashMap<String , String> headermap) 
     2             throws ClientProtocolException, IOException {
     3         //创建一个可关闭的 httpClient对象
     4         CloseableHttpClient httpClient = HttpClients.createDefault();
     5         //创建一个HttpPost的请求对象
     6         HttpPost httpPost = new HttpPost(url);
     7         //设置payload
     8         httpPost.setEntity(new StringEntity(entityString));
     9         //加载请求头到HttpPost对象
    10         for (Map.Entry<String , String> entry : headermap.entrySet()) {
    11             httpPost.addHeader(entry.getKey(), entry.getValue());
    12         }
    13         //发送post请求
    14         CloseableHttpResponse httpResponse = httpClient.execute(httpPost);
    15         return httpResponse;
    16     }

    2. 发送Post请求后,我们会得到一个CloseableHttpResponse。接下来,我们提取状态码(status):

    int statusCode = closeableHttpResponse.getStatusLine().getStatusCode();

    3. 提取返回实体(httpEntity):

     HttpEntity entity = closeableHttpResponse.getEntity();
     System.out.println(entity);

    此时的输出结果为:

    4. HttpEntity 转化为 String:

    String responseEntity = EntityUtils.toString(entity);
    System.out.println(responseEntity);

    此时的输出结果为String格式,提取code、message等值,只能通过字符串截取:

    5. String 转化为 JsonObject:

    1 JSONObject jsonObject = JSON.parseObject(responseEntity);
    2 System.out.println(jsonObject);

    此时的输出结果为JsonObject格式:

    6. 提取code、message的值:

    1 String responseCode = jsonObject.getString("code");
    2 String responseMessage = jsonObject.getString("message");

    7. 提取orderId:

    复制代码
    1 //由于info的值是json格式(或可理解为key-value集合),提取info的值为JSONObject格式
    2 JSONObject infoObject = jsonObject.getJSONObject("info");
    3 //重复步骤6,提取orderId
    4 String orderId= jsonObject.getString("orderId");
    5 //或通过将infoObject转化为HashMap,再进行提取orderId
    6 HashMap<String, Object> info = new HashMap<String, Object>();
    7 info = JSON.parseObject(String.valueOf(infoObject), new TypeReference<HashMap<String, Object>>() {});
    8 String orderId = info.get("orderId").toString();
    复制代码

    实现接口HttpEntity的类

    这些实现接口HttpEntity的类,其实就是在HttpEntity功能上添加了一些小小的功能。看这些类的名字就能知道它添加了什么功能。

    a . BasicHttpEntity

          代表底层流的基本实体。通常是在http报文中获取的实体。他只有一个空参的构造方法。刚创建时没有内容,长度为负值。需要通过两个方法,把值赋进去。

    b.  ByteArrayEntity

        是自我包含的,可重复获得使用的,从指定的字节数组中取出内容的实体。字节数组是这个实体的构造方法的参数

    c.StringEntity

        是自我包含的可重复的实体。通过String创建的实体。有两个构造方法,一个是自Sring为参数的构造方法,一个是以String和字符编码为参数的构造方法。

    d.InputreamEntity

        是流式不可以重复的实体。构造方法是InputStream 和内容长度,内容长度是输入流的长度。

    等诸多继承类,并且可以使用

  • 相关阅读:
    Python面向对象(组合、菱形继承、多态)
    Python面向对象
    Python hash、xml、configparser、sheve、shutil模块讲解 以及 面向对象初识
    python正则re模块
    Python序列化、date、random、os模块
    Python包和日志模块
    python面向对象、模块讲解
    python递归函数、二分法、匿名函数、(sorted、map、filter内置函数应用)
    Python生成器、三元表达式、列表生成式、字典生成式、生成器表达式
    Python迭代器
  • 原文地址:https://www.cnblogs.com/yangj-Blog/p/13099132.html
Copyright © 2011-2022 走看看