org.springframework.web.client.httpclienterrorexception:resttemplate中有400个错误请求

bakd9h0s  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(551)

我使用rest模板发布数据json,当我测试o postmen时,它运行success并返回200。
这是我的json格式:

  1. {
  2. "senderUser": "user@gmail.com",
  3. "data": [
  4. {
  5. "actionType": "update-contact",
  6. "data": {
  7. "name": "luong van",
  8. "lastname": "khanh",
  9. "type": 0,
  10. "title": "",
  11. "passport": "",
  12. "gender": 1,
  13. "bgInfo": "",
  14. "dateOfBirth": "",
  15. "emails": [{"value": "user@gmail.com"}],
  16. "phones": [{"value": "0902032618"}],
  17. "addresses": [{"street": "10", "city":"Osaka", "state": "Osake", "country":
  18. {"code":"JP", "name":"Japan"}}],
  19. "tag": ""
  20. }
  21. }
  22. ]
  23. }

这是我的消息来源:

  1. public static void main(String []args) {
  2. RestTemplate restTemplate = new RestTemplate();
  3. MappingJackson2HttpMessageConverter jsonHttpMessageConverter = new MappingJackson2HttpMessageConverter();
  4. jsonHttpMessageConverter.getObjectMapper().configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
  5. restTemplate.getMessageConverters().add(jsonHttpMessageConverter);
  6. String url = "https://myservice.com/listeners/60011cbd4a674458d3b26025/90336429462601e7f3326641898fabd9948b349d";
  7. try {
  8. System.out.println("hi there");
  9. JSONArray json = new JSONArray();
  10. JSONObject obj = new JSONObject();
  11. obj.put("name", "khanh");
  12. obj.put("lastname", "luong van");
  13. obj.put("type", "0");
  14. obj.put("dateOfBirth", "");
  15. obj.put("emails", "user@gmail.com");
  16. obj.put("phones", "0902032618");
  17. obj.put("addresses", "Osaka");
  18. json.put(obj);
  19. HttpHeaders headers = new HttpHeaders();
  20. headers.add("Accept", MediaType.APPLICATION_JSON.toString());
  21. headers.add("Content-Type", MediaType.APPLICATION_JSON.toString());
  22. HttpEntity<String> entity = new HttpEntity<String>(obj.toString(), headers);
  23. String result = restTemplate.postForObject(url, entity, String.class);
  24. System.out.println(result);
  25. }
  26. catch(Exception e) {
  27. e.printStackTrace();
  28. }
  29. }

生成日志时出现异常:

  1. 17:07:58.483 [main] DEBUG org.springframework.web.client.RestTemplate - Created POST request for "https://myservice.com/listeners/60011cbd4a674458d3b26025/90336429462601e7f3326641898fabd9948b349d"
  2. 17:07:58.485 [main] DEBUG org.springframework.web.client.RestTemplate - Setting request Accept header to [text/plain, application/json, application/json, application/*+json, application/*+json, */*]
  3. 17:07:58.486 [main] DEBUG org.springframework.web.client.RestTemplate - Writing [{"emails":"user@gmail.com","addresses":"Osaka","name":"khanh","phones":"0902032618","dateOfBirth":"","type":"0","lastname":"luong van"}] as "application/json" using [org.springframework.http.converter.StringHttpMessageConverter@3a7442c7]
  4. 17:07:58.831 [main] DEBUG org.springframework.web.client.RestTemplate - POST request for "https://myservice.com/listeners/60011cbd4a674458d3b26025/90336429462601e7f3326641898fabd9948b349d" resulted in 400 (Bad Request); invoking error handler
  5. org.springframework.web.client.HttpClientErrorException: 400 Bad Request
  6. at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91)
  7. at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:667)
  8. at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:620)
  9. at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:580)
  10. at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:380)
  11. at com.javainuse.TestConnect.main(TestConnect.java:56)

我尝试了很多方法,但仍然发生同样的错误,我如何才能解决这个问题?非常感谢

cs7cruho

cs7cruho1#

我认为在这种情况下,错误的要求是正确的答案。在使用postman的测试中,您通过了请求主体:

  1. {
  2. "senderUser": "user@gmail.com",
  3. "data": [{
  4. "actionType": "update-contact",
  5. "data": {
  6. "name": "luong van",
  7. "lastname": "khanh",
  8. "type": 0,
  9. "title": "",
  10. "passport": "",
  11. "gender": 1,
  12. "bgInfo": "",
  13. "dateOfBirth": "",
  14. "emails": [{
  15. "value": "user@gmail.com"
  16. }],
  17. "phones": [{
  18. "value": "0902032618"
  19. }],
  20. "addresses": [{
  21. "street": "10",
  22. "city": "Osaka",
  23. "state": "Osake",
  24. "country": {
  25. "code": "JP",
  26. "name": "Japan"
  27. }
  28. }],
  29. "tag": ""
  30. }
  31. }]
  32. }

当您的应用程序日志显示您正在发送请求正文时:

  1. {
  2. "emails": "user@gmail.com",
  3. "addresses": "Osaka",
  4. "name": "khanh",
  5. "phones": "0902032618",
  6. "dateOfBirth": "",
  7. "type": "0",
  8. "lastname": "luong van"
  9. }

除非您尝试使用的服务具有足够的通用性,可以接受太多不同的请求主体,否则它将触发错误的请求响应。
我建议您将postman的请求主体作为参数传递给httpentity构造函数作为测试:

  1. HttpEntity<String> entity = new HttpEntity<String>("{\r\n" +
  2. " \"senderUser\": \"user@gmail.com\",\r\n" +
  3. " \"data\": [{\r\n" +
  4. " \"actionType\": \"update-contact\",\r\n" +
  5. " \"data\": {\r\n" +
  6. " \"name\": \"luong van\",\r\n" +
  7. " \"lastname\": \"khanh\",\r\n" +
  8. " \"type\": 0,\r\n" +
  9. " \"title\": \"\",\r\n" +
  10. " \"passport\": \"\",\r\n" +
  11. " \"gender\": 1,\r\n" +
  12. " \"bgInfo\": \"\",\r\n" +
  13. " \"dateOfBirth\": \"\",\r\n" +
  14. " \"emails\": [{\r\n" +
  15. " \"value\": \"user@gmail.com\"\r\n" +
  16. " }],\r\n" +
  17. " \"phones\": [{\r\n" +
  18. " \"value\": \"0902032618\"\r\n" +
  19. " }],\r\n" +
  20. " \"addresses\": [{\r\n" +
  21. " \"street\": \"10\",\r\n" +
  22. " \"city\": \"Osaka\",\r\n" +
  23. " \"state\": \"Osake\",\r\n" +
  24. " \"country\": {\r\n" +
  25. " \"code\": \"JP\",\r\n" +
  26. " \"name\": \"Japan\"\r\n" +
  27. " }\r\n" +
  28. " }],\r\n" +
  29. " \"tag\": \"\"\r\n" +
  30. " }\r\n" +
  31. " }]\r\n" +
  32. "}", headers);
展开查看全部
yws3nbqq

yws3nbqq2#

使用与json模式和jacksonmapper或类似工具匹配的pojo来节省时间。pojo到json,反之亦然,这并不是一个你需要对imo过于担心的问题,因为有框架级的功能和库来解决这个问题。用jsonarray和jsonobject构建它过于冗长,而且容易出现人为错误。

相关问题