我想使用基于OKHttp3 3的RestTemplate远程调用接口queryByIds来获取基本的用户信息。
@Configuration
public class CloudConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate(new OkHttp3ClientHttpRequestFactory());
}
}实现方法queryByIds如下:
@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:
// 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);这是我的功用课:
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;
queryByIds --在Chrome的地址栏和邮递员中--它抛出了一个queryByIdsqueryByIds中用@RequestBody代替了@RequestParam,它仍然抛出了一个@RequestBody后一种message2:

发布于 2021-08-17 09:53:04
实际上,我不会像您正在做的那样将JSON传递到查询参数中,这是非常糟糕的,并不真正遵循任何RESTFUL标准。
在我看来,你有4个选择:
?userIds=W1wiMjEwNzI2RzcxSFNZMllZOFwiLFwiMjAwNjI4QUZZTTdBR1dQSFwiXQ==
中执行逗号分隔的ID列表
?userIds=210726G71HSY2YY8,200628AFYM7AGWPH
您的需求可能将决定您采取的方法。
https://stackoverflow.com/questions/68799051
复制相似问题