控制层接受参数

关于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时,都是将它转化为json

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();
复制代码

 

posted @ 2020-06-12 14:21  To_Yang  阅读(943)  评论(0编辑  收藏  举报