controller层接收List类型的参数

本文介绍了一个使用Java实现的HTTP客户端测试类,该类通过发送JSON格式的消息进行认证、发布与消费操作,并处理响应结果。文章详细展示了如何构建HTTP请求、解析响应以及实现消息的重试与确认流程。

ofeqx.com 方程式科技共享平台 外文资料好找好用。大数据有序化,
专业垂直领域体系的知识共享盘平台,发表您的创作与我们共产知识。

1 一定是post 提交
在这里插入图片描述
json 的参数
[{“type”:“20”,“authType”:“1,2,3”},{“type”:“21”,“authType”:“2,3”}]

2 一定要有@RequestBody

在这里插入图片描述

fastjson

json 转换成list

public RespVo insertAuthDir(@RequestBody String json){
    JSONObject jsonObject = JSONObject.parseObject(json);

    List<AuthDirTypeVo> list = JSON.parseArray(jsonObject.get("authTypeVoList").toString(),AuthDirTypeVo.class);

json 转换成对象

public RespVo updateDeployAndApprove(@RequestBody String json){

    JSONObject jsonObject = JSONObject.parseObject(json);
    String JSONStr = JSON.toJSONString(jsonObject.get("jrsStrategyDeploy"));
    JrsStrategyDeploy jrsStrategyDeploy = JSON.parseObject(JSONStr, JrsStrategyDeploy.class);

package com.jd.jmq.server.proxy;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.junit.Test;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**

  • Created by dingjun on 15-3-27.
    */
    public class HttpClientTest {
    private String authid = null;

    private String topic=“jmq_proxy”;
    private String app=“proxy”;
    private String password = “81FB129A”;
    /**
    private String topic=“jmq_test”;
    private String app=“jmq”;
    private String password = “0C2F4E21”;
    */
    private String[] servers = null;
    public void testAuth(){
    if(authid == null) {
    try {
    String str = httpclient(“http://192.168.149.144:8080/1.0/auth”, “{‘user’:'”+app+“‘,‘password’:’”+password+“‘,‘topic’:’”+topic+“‘,‘app’:’”+app+“'}”);
    JSONObject jsonObject = JSON.parseObject(str);
    JSONObject statusObj = jsonObject.getJSONObject(“status”);
    if (statusObj.getIntValue(“code”) == 0) {
    JSONObject result = jsonObject.getJSONObject(“result”);
    authid = result.getString(“authid”);
    JSONArray proxys = result.getJSONArray(“servers”);
    if(proxys.isEmpty()){
    throw new RuntimeException(“proxys is empty”);
    }else{
    servers = proxys.toArray(new String[proxys.size()]);
    }
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    @Test
    public void testPut(){
    while(true) {
    String put = “{‘topic’:'”+topic+“‘,‘app’:’”+app+“',‘messages’:[{‘businessId’:‘id1’,‘text’:‘abc’,‘attributes’:{‘p1’:‘aaaa’,‘p2’:‘bbb’,‘p3’:‘ccc’}},{‘businessId’:‘id2’,‘text’:‘def’}]}”;
    try {
    if(servers == null || servers.length == 0) {
    testAuth();
    continue;
    }else {
    String str = httpclient(“http://”+servers[0]+“/1.0/produce”, put);
    System.out.println(“put:”+put);
    JSONObject jsonObject = JSON.parseObject(str);
    JSONObject statusObj = jsonObject.getJSONObject(“status”);
    if(statusObj.getIntValue(“code”)==0){
    //发送成功
    }else if(statusObj.getIntValue(“code”)==2){
    //认证失败,重新认证
    servers = null;
    testAuth();
    continue;
    }
    }

         } catch (Exception e) {
             e.printStackTrace();
             break;
         }
     }
    

    }

    @Test
    public void testGet(){
    Random r = new Random();

     for(int i=0;i<10000;i++) {
         String get = "{'topic':'"+topic+"','app':'"+app+"'}";
         try {
             if(servers == null || servers.length == 0) {
                 testAuth();
                 continue;
             }else {
                 String str = httpclient("http://"+servers[0]+"/1.0/consume", get);
                 System.out.println("get:" + get);
                 JSONObject jsonObject = JSON.parseObject(str);
                 JSONObject statusObj = jsonObject.getJSONObject("status");
                 //处理业务逻辑
                 if(statusObj.getIntValue("code")==0){
                     //发送成功
                 }else if(statusObj.getIntValue("code")==2){
                     //认证失败,重新认证
                     servers = null;
                     testAuth();
                     continue;
                 }
                 if(r.nextInt(100)<3){
                     //业务报错转重试服务,继续消费
                     String rz = httpclient("http://"+servers[0]+"/1.0/retry", retry(str));
                     JSONObject result = JSON.parseObject(rz);
                     statusObj = result.getJSONObject("status");
                 }else{
                     //消费确认
                     String rz = httpclient("http://"+servers[0]+"/1.0/ack", ack(str));
                     JSONObject result = JSON.parseObject(rz);
                 }
             }
         } catch (Exception e) {
             e.printStackTrace();
             break;
         }
     }
    

    }

    public String ack(String str){
    JSONObject jsonObject = JSON.parseObject(str).getJSONObject(“result”);
    JSONArray messages = jsonObject.getJSONArray(“messages”);
    HttpAckMessage ackMessage = new HttpAckMessage();
    ackMessage.setAddress(jsonObject.getString(“address”));
    ackMessage.setApp(jsonObject.getString(“app”));
    ackMessage.setConsumerId(jsonObject.getString(“consumerId”));
    ackMessage.setTopic(jsonObject.getString(“topic”));
    ackMessage.setBrokerGroup(jsonObject.getString(“brokerGroup”));

     List<HttpAckLocation> locations = new ArrayList<HttpAckLocation>();
     if(messages == null){
         return null;
     }else{
         System.out.println("messages:"+messages.size());
     }
     for(int i=0;i<messages.size();i++){
         JSONObject msg = messages.getJSONObject(i);
         String topic = msg.getString("topic");
         short queueId = msg.getShortValue("queueId");
         long queueOffset = msg.getLong("queueOffset");
         long journalOffset = msg.getLong("journalOffset");
    
         HttpAckLocation loc = new HttpAckLocation();
         loc.setTopic(topic);
         loc.setQueueId(queueId);
         loc.setQueueOffset(queueOffset);
         loc.setJournalOffset(journalOffset);
         locations.add(loc);
     }
     ackMessage.setLocations(locations.toArray(new HttpAckLocation[locations.size()]));
    
     String ack = JSON.toJSONString(ackMessage);
     System.out.println(ack);
     return ack;
    

    }

    public String retry(String str){
    JSONObject jsonObject = JSON.parseObject(str).getJSONObject(“result”);
    JSONArray messages = jsonObject.getJSONArray(“messages”);
    HttpRetryMessage ackMessage = new HttpRetryMessage();
    ackMessage.setAddress(jsonObject.getString(“address”));
    ackMessage.setApp(jsonObject.getString(“app”));
    ackMessage.setConsumerId(jsonObject.getString(“consumerId”));
    ackMessage.setTopic(jsonObject.getString(“topic”));
    ackMessage.setBrokerGroup(jsonObject.getString(“brokerGroup”));

     List<HttpAckLocation> locations = new ArrayList<HttpAckLocation>();
     if(messages == null){
         return null;
     }else{
         System.out.println("messages:"+messages.size());
     }
     for(int i=0;i<messages.size();i++){
         JSONObject msg = messages.getJSONObject(i);
         String topic = msg.getString("topic");
         short queueId = msg.getShortValue("queueId");
         long queueOffset = msg.getLong("queueOffset");
         long journalOffset = msg.getLong("journalOffset");
    
         HttpAckLocation loc = new HttpAckLocation();
         loc.setTopic(topic);
         loc.setQueueId(queueId);
         loc.setQueueOffset(queueOffset);
         loc.setJournalOffset(journalOffset);
         locations.add(loc);
     }
     ackMessage.setLocations(locations.toArray(new HttpAckLocation[locations.size()]));
     ackMessage.setExecption("test random exception");
     String ack = JSON.toJSONString(ackMessage);
     System.out.println(ack);
     return ack;
    

    }

    public String httpclient(String host,String content) throws Exception {
    HttpClientBuilder builder = HttpClientBuilder.create();
    RequestConfig.Builder confBuild = RequestConfig.custom();
    confBuild.setConnectTimeout(5000);
    confBuild.setConnectionRequestTimeout(30*1000);

     builder.setDefaultRequestConfig(confBuild.build());
     CloseableHttpClient httpclient = builder.build();
    
     String rs = null;
     ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
    
         public String handleResponse(
                 final HttpResponse response) throws ClientProtocolException, IOException {
             int status = response.getStatusLine().getStatusCode();
             if (status >= 200 && status < 300) {
                 HttpEntity entity = response.getEntity();
                 return entity != null ? EntityUtils.toString(entity,Charset.forName("UTF-8")) : null;
             } else {
                 throw new ClientProtocolException("Unexpected response status: " + status);
             }
         }
    
     };
    
     try {
         HttpPost httppost = new HttpPost(host);
         httppost.addHeader("User-Agent","JMQ-PHP/1.0.1");
         httppost.addHeader("Accept","text/plain");
         httppost.addHeader("Host","api.jmq.jd.com");
         httppost.addHeader("Timestamp",String.valueOf(System.currentTimeMillis()));
         httppost.addHeader("authid",authid);
         httppost.setEntity(new StringEntity(content, Charset.forName("UTF-8")));
         System.out.println("Executing request: " + httppost.getRequestLine());
    
         rs = httpclient.execute(httppost, responseHandler);
         System.out.println("Executing response: " + rs);
    
     } finally {
         httpclient.close();
     }
     return rs;
    

    }

    public class HttpAckLocation {

     // 队列偏移
     private long queueOffset;
     // 日志偏移量
     private long journalOffset;
     // 主题
     protected String topic;
     // 队列ID(>=1)
     protected short queueId;
    
     public long getQueueOffset() {
         return queueOffset;
     }
    
     public void setQueueOffset(long queueOffset) {
         this.queueOffset = queueOffset;
     }
    
     public long getJournalOffset() {
         return journalOffset;
     }
    
     public void setJournalOffset(long journalOffset) {
         this.journalOffset = journalOffset;
     }
    
     public String getTopic() {
         return topic;
     }
    
     public void setTopic(String topic) {
         this.topic = topic;
     }
    
     public short getQueueId() {
         return queueId;
     }
    
     public void setQueueId(short queueId) {
         this.queueId = queueId;
     }
    

    }

    public class HttpAckMessage {
    private String topic;
    private String app;
    private String brokerGroup;
    private String address;
    private String consumerId;
    private HttpAckLocation[] locations;

     public HttpAckLocation[] getLocations() {
         return locations;
     }
    
     public void setLocations(HttpAckLocation[] locations) {
         this.locations = locations;
     }
    
     public String getConsumerId() {
         return consumerId;
     }
    
     public void setConsumerId(String consumerId) {
         this.consumerId = consumerId;
     }
    
     public HttpAckMessage() {
    
     }
    
     public String getTopic() {
         return topic;
     }
    
     public void setTopic(String topic) {
         this.topic = topic;
     }
    
     public String getApp() {
         return app;
     }
    
     public void setApp(String app) {
         this.app = app;
     }
    
     public String getBrokerGroup() {
         return brokerGroup;
     }
    
     public void setBrokerGroup(String brokerGroup) {
         this.brokerGroup = brokerGroup;
     }
    
     public String getAddress() {
         return address;
     }
    
     public void setAddress(String address) {
         this.address = address;
     }
    

    }

    public class HttpRetryMessage {
    private String topic;
    private String app;
    private String brokerGroup;
    private String address;
    private String consumerId;
    private String execption;

     private HttpAckLocation[] locations;
    
     public HttpAckLocation[] getLocations() {
         return locations;
     }
    
     public void setLocations(HttpAckLocation[] locations) {
         this.locations = locations;
     }
    
     public String getConsumerId() {
         return consumerId;
     }
    
     public void setConsumerId(String consumerId) {
         this.consumerId = consumerId;
     }
    
     public HttpRetryMessage() {
     }
    
     public String getTopic() {
         return topic;
     }
    
     public void setTopic(String topic) {
         this.topic = topic;
     }
    
     public String getApp() {
         return app;
     }
    
     public void setApp(String app) {
         this.app = app;
     }
    
     public String getBrokerGroup() {
         return brokerGroup;
     }
    
     public void setBrokerGroup(String brokerGroup) {
         this.brokerGroup = brokerGroup;
     }
    
     public String getAddress() {
         return address;
     }
    
     public void setAddress(String address) {
         this.address = address;
     }
    
    
     public String getExecption() {
         return execption;
     }
    
     public void setExecption(String execption) {
         this.execption = execption;
     }
    

    }

}

### 回答1: controller可以接收list类型参数。在Java中,可以使用List<T>来表示一个元素类型为T的列表。在Spring MVC中,可以使用@RequestParam注解来将请求参数绑定到方法参数上,例如: ``` @RequestMapping("/test") public String test(@RequestParam("list") List<String> list) { // 处理list参数 return "success"; } ``` 在上面的例子中,@RequestParam("list")表示将请求参数中名为"list"的参数绑定到方法参数list上,list类型List<String>,表示一个字符串类型的列表。当请求中包含多个名为"list"的参数时,Spring MVC会将它们合并成一个列表。 ### 回答2: Controller作为MVC框架中的控制器,负责接收前端传递的请求并进行处理。当需要接收list参数时,则需要采用相应的方式对参数进行接收和处理。 对于list参数接收,常用的方式是通过request.getParameterValues()方法获取属性值数组,然后进行遍历和处理。具体地说,可以将接收到的参数数组转化为List集合或数组进行进一步处理。 例如,当接收一个由多个水果组成的列表时,可以通过以下代码实现参数接收和处理: ``` @RequestMapping("/fruits") public String handleFruits(HttpServletRequest request) { String[] arrFruit = request.getParameterValues("fruit"); List<String> listFruit = Arrays.asList(arrFruit); for(String fruit: listFruit) { //进行相应的处理操作 System.out.println(fruit); } return "success"; } ``` 在这个例子中,我们首先调用request对象的getParameterValues()方法获取到属性值的数组,然后将其转化为List集合进行遍历和处理。 另外,当需要接收复杂的list参数时,可以考虑采用JavaBean进行封装,以方便后续的处理。具体地说,通过在bean中定义相应的参数属性,可以将接收到的参数自动封装为JavaBean对象。 例如,当接收一个由多个学生组成的列表时,可以先定义一个Student类,然后采用以下代码进行参数接收和封装: ``` @RequestMapping("/students") public String handleStudents(StudentList studentList) { List<Student> listStudent = studentList.getStudents(); for(Student student: listStudent) { //进行相应的处理操作 System.out.println(student.getName()); } return "success"; } public class StudentList { private List<Student> students; //getter和setter方法省略 } public class Student { private String name; private int age; //getter和setter方法省略 } ``` 通过这样的方式,我们将接收到的参数直接封装为了StudentList对象,从而方便了后续的处理。在实际开发中,我们可以根据实际情况选择合适的方式进行参数接收和处理。 ### 回答3: Controller是MVC模式中的控制器,它的作用是接收来自用户的请求并将请求转发给相应的模型进行处理。当接收到请求时,Controller需要获取请求中传递参数,一种常见的参数形式就是List参数List参数是一个列表形式的参数,包含多个元素,每个元素的类型可以相同也可以不同。在Controller中,我们可以通过如下方式来接收List参数: 1.在方法参数中直接定义List类型参数: ``` @RequestMapping("/testList") @ResponseBody public String test(List<Integer> nums) { // nums即为List参数,可以在该方法中使用 // ... } ``` 2.使用@RequestParam注解指定List参数: ``` @RequestMapping("/testList") @ResponseBody public String test(@RequestParam("nums") List<Integer> nums) { // nums即为List参数,可以在该方法中使用 // ... } ``` 在使用List参数时,需要注意以下几点: 1.List参数需要在请求中以特定的格式传递,常见的格式有逗号分隔、中括号包围等。 2.如果List参数类型为自定义对象,需要在Controller中定义对应的类,并在请求中以JSON或者XML形式传递参数。 3.List参数的处理方式与普通参数类似,可以进行类型转换、校验等操作。 综上所述,Controller接收List参数需要在方法参数中定义List类型参数或使用@RequestParam注解指定List参数,并注意参数传递格式和类型转换等问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值