为什么在 postman 中传递 Map<String,String> 作为 JSON 有效,但在 Java RestTemplate 中传递地图不起作用?
Why passing Map<String,String> in postman as JSON works but passing the map in Java RestTemplate does not work?
此项目用于 WAR 应用程序,该应用程序 运行 在 JBOSS 应用程序服务器 (GraphClient.war) 上,部署后我可以使用网址如:
http://localhost:8080/GraphClient/helloworld
我调用此控制器传递 Map,使用邮递员配置 Body > RAW > Json (application/json) 并传递地图,如:
{
"hello1":"Jupiter",
"hello2":"Mercury",
"hello3":"Venus",
"hello4":"Mars",
"hello5":"Earth"
}
它可以工作,但是如果我从另一个控制器在 Java 中发送相同的 Map,我会收到 405 方法不允许。这是代码:
@RequestMapping(value="/callhelloworld", method=RequestMethod.GET)
public String caller( )
{
MultiValueMap<String, String> body = new LinkedMultiValueMap<String,String>();
body.add("planet1","Jupiter");
body.add("planet2","Mercury");
body.add("planet3","Venus");
body.add("planet4","Mars");
body.add("planet5","Earth");
HttpHeaders headers = new HttpHeaders();
// headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE);
HttpEntity<?> entity = new HttpEntity<>(body, headers);
RestTemplate rt = new RestTemplate();
HttpEntity<String> response = rt.exchange(
"http://localhost:8080/GraphClient/helloworld",
HttpMethod.POST,
entity,
String.class
);
return response.getBody();
}
@RequestMapping(value="/helloworld", method=RequestMethod.GET, consumes=MediaType.APPLICATION_JSON_VALUE)
public String helper( @RequestBody HashMap<String,String> values )
{
String acumPlanets = "PLANETS HERE = ";
for (Map.Entry<String, String> item : values.entrySet()) {
System.out.println("Key " + item.getKey() + " Value " + item.getValue() );
acumPlanets += item.getValue();
}
return acumPlanets;
}
你能意识到我在使用 RestTemplate 时做错了什么吗?
谢谢,
您定义了端点以接收 HTTP GET 请求:
@RequestMapping(value="/helloworld", method=RequestMethod.GET, consumes=MediaType.APPLICATION_JSON_VALUE)
但实际上使用 RestTemplate 您正在执行 HTTP POST 请求:
HttpEntity<String> response = rt.exchange(
"http://localhost:8080/GraphClient/helloworld",
HttpMethod.POST,
entity,
String.class
);
建立在@Isakots 和@M.Deinum 的两个答案之上。
这里有两个问题需要解决:
- 您正在通过 GET 请求发送一个 JSON 正文,这是不利的
- 您正在尝试使用 LinkedValueMap 发送类似于 {"key1":"value1"..} 的简单 json 对象。
为了解决第一个问题。您应该将端点定义为 POST。
示例:
@RequestMapping(value="/helloworld", method=RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE)
为了解决第二个问题,请将您的 LinkedValueMap
替换为 Map
。示例:
Map<String, String> body = new HashMap<>();
body.put("planet1","Jupiter");
body.put("planet2", "Mercury");
body.put("planet3", "Venus");
body.put("planet4", "Mars");
body.put("planet5", "Earth");
HttpEntity<?> entity = new HttpEntity<>(body);
RestTemplate rt = new RestTemplate();
HttpEntity<String> response = rt.exchange(
"http://localhost:8080/GraphClient/helloworld",
HttpMethod.POST,
entity,
String.class
);
这两项更改后,一切都应该按预期工作。
此项目用于 WAR 应用程序,该应用程序 运行 在 JBOSS 应用程序服务器 (GraphClient.war) 上,部署后我可以使用网址如:
http://localhost:8080/GraphClient/helloworld
我调用此控制器传递 Map
{
"hello1":"Jupiter",
"hello2":"Mercury",
"hello3":"Venus",
"hello4":"Mars",
"hello5":"Earth"
}
它可以工作,但是如果我从另一个控制器在 Java 中发送相同的 Map
@RequestMapping(value="/callhelloworld", method=RequestMethod.GET)
public String caller( )
{
MultiValueMap<String, String> body = new LinkedMultiValueMap<String,String>();
body.add("planet1","Jupiter");
body.add("planet2","Mercury");
body.add("planet3","Venus");
body.add("planet4","Mars");
body.add("planet5","Earth");
HttpHeaders headers = new HttpHeaders();
// headers.set(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE);
HttpEntity<?> entity = new HttpEntity<>(body, headers);
RestTemplate rt = new RestTemplate();
HttpEntity<String> response = rt.exchange(
"http://localhost:8080/GraphClient/helloworld",
HttpMethod.POST,
entity,
String.class
);
return response.getBody();
}
@RequestMapping(value="/helloworld", method=RequestMethod.GET, consumes=MediaType.APPLICATION_JSON_VALUE)
public String helper( @RequestBody HashMap<String,String> values )
{
String acumPlanets = "PLANETS HERE = ";
for (Map.Entry<String, String> item : values.entrySet()) {
System.out.println("Key " + item.getKey() + " Value " + item.getValue() );
acumPlanets += item.getValue();
}
return acumPlanets;
}
你能意识到我在使用 RestTemplate 时做错了什么吗?
谢谢,
您定义了端点以接收 HTTP GET 请求:
@RequestMapping(value="/helloworld", method=RequestMethod.GET, consumes=MediaType.APPLICATION_JSON_VALUE)
但实际上使用 RestTemplate 您正在执行 HTTP POST 请求:
HttpEntity<String> response = rt.exchange(
"http://localhost:8080/GraphClient/helloworld",
HttpMethod.POST,
entity,
String.class
);
建立在@Isakots 和@M.Deinum 的两个答案之上。
这里有两个问题需要解决:
- 您正在通过 GET 请求发送一个 JSON 正文,这是不利的
- 您正在尝试使用 LinkedValueMap 发送类似于 {"key1":"value1"..} 的简单 json 对象。
为了解决第一个问题。您应该将端点定义为 POST。 示例:
@RequestMapping(value="/helloworld", method=RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_VALUE)
为了解决第二个问题,请将您的 LinkedValueMap
替换为 Map
。示例:
Map<String, String> body = new HashMap<>();
body.put("planet1","Jupiter");
body.put("planet2", "Mercury");
body.put("planet3", "Venus");
body.put("planet4", "Mars");
body.put("planet5", "Earth");
HttpEntity<?> entity = new HttpEntity<>(body);
RestTemplate rt = new RestTemplate();
HttpEntity<String> response = rt.exchange(
"http://localhost:8080/GraphClient/helloworld",
HttpMethod.POST,
entity,
String.class
);
这两项更改后,一切都应该按预期工作。