首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法正确传递列表json param

无法正确传递列表json param
EN

Stack Overflow用户
提问于 2021-08-16 07:39:59
回答 1查看 97关注 0票数 0

我想使用基于OKHttp3 3的RestTemplate远程调用接口queryByIds来获取基本的用户信息。

代码语言:javascript
复制
@Configuration
public class CloudConfig {
    
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
    }
}

实现方法queryByIds如下:

代码语言:javascript
复制
    @GetMapping("/queryByIds")
    public GraceJSONResult queryByIds(@RequestParam String userIds) {
        if (StringUtils.isBlank(userIds)) {
            return GraceJSONResult.errorCustom(ResponseStatusEnum.USER_NOT_EXIST_ERROR);
        }
        List<String> userIdList = JsonUtils.jsonToList(userIds, String.class);
        ArrayList<AppUserVO> userVOList = new ArrayList<>();
        assert userIdList != null;
        userIdList.forEach(id -> {
            AppUserVO userInfo = getBasicUserInfo(id);
            userVOList.add(userInfo);
        });
        return GraceJSONResult.ok(userVOList);
    }

下面是业务代码,http://user.mootalk.com使用SwitchHosts切换到localhost

代码语言:javascript
复制
        // Get the basic information of each user and put it in userVOList
        String userServerUrlExecute = "http://user.mootalk.com:8003/user/queryByIds?userIds=" + JsonUtils.objectToJson(publisherIdSet);

        System.out.println(userServerUrlExecute);

        // the debugger paused
        ResponseEntity<GraceJSONResult> entity =
                restTemplate.getForEntity(userServerUrlExecute, GraceJSONResult.class);

这是我的功用课:

代码语言:javascript
复制
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.List;

/**
 * json converter
 */
public class JsonUtils {
    
    private static final ObjectMapper MAPPER = new ObjectMapper();
    
    
    public static String objectToJson(Object data) {
        try {
            String string = MAPPER.writeValueAsString(data);
            return string;
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    
    public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {
        try {
            T t = MAPPER.readValue(jsonData, beanType);
            return t;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    
    
    public static <T> List<T> jsonToList(String jsonData, Class<T> beanType) {
        JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
        try {
            List<T> list = MAPPER.readValue(jsonData, javaType);
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return null;
    }
    
}

当我调试代码时,它没有进入queryByIds方法,控制台打印了下面的userServerUrlExecute

但是,如果您在Postman中像这样构造了一个请求:http://user.mootalk.com:8003/user/queryByIds?userIds=210726G71HSY2YY8,它可以进入queryByIds方法,但是userIdList结果为null。

如果您在Postman中构建了这样的请求:http://user.mootalk.com:8003/user/queryByIds?userIds=[\"210726G71HSY2YY8\",\"200628AFYM7AGWPH\"],那么它工作得很好。

那么,我的代码在传递param时有什么问题呢?

稍后的message1:

最后一个构造请求400 Bad Request;

  1. 现在没有进入queryByIds --在Chrome的地址栏和邮递员中--它抛出了一个queryByIds

  1. I在queryByIds中用@RequestBody代替了@RequestParam,它仍然抛出了一个@RequestBody

后一种message2:

  1. 现在使用相同的代码。这真的是个谜。

EN

回答 1

Stack Overflow用户

发布于 2021-08-17 09:53:04

实际上,我不会像您正在做的那样将JSON传递到查询参数中,这是非常糟糕的,并不真正遵循任何RESTFUL标准。

在我看来,你有4个选择:

  1. 更改为HTTP请求并将JSON数据传递到请求主体(推荐并遵循最佳实践)。

?userIds=W1wiMjEwNzI2RzcxSFNZMllZOFwiLFwiMjAwNjI4QUZZTTdBR1dQSFwiXQ==

  1. ,如果它必须是HTTP请求,但不需要是JSON,那么我将在查询参数

中执行逗号分隔的ID列表

?userIds=210726G71HSY2YY8,200628AFYM7AGWPH

  1. 一次只请求一个用户id。

您的需求可能将决定您采取的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68799051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档