当前位置: 首页 > 知识库问答 >
问题:

在JSON的RestTem板中获取请求

田彬郁
2023-03-14

一个看似超级直截了当的问题已经困扰了几天:

我在application/json中使用RestTemplate发出一个简单的GET请求,但我一直在获取

org.springframework.web.client.HttpClientErrorException: 400 Bad Request
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91)
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:636)
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:592)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:552)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:470)

我做了研究并遵循了本教程,还通过JSON中的RestTemplate查看了来自此POST请求的解决方案。但他们都没有帮助,以下是我的代码:

RestTemplate restTemplate = new RestTemplate();    
HttpHeaders requestHeaders = new HttpHeaders();    
requestHeaders.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<?> requestEntity = new HttpEntity<Object>(requestHeaders);
restTemplate.exchange(endpoint, HttpMethod.GET, requestEntity, String.class);

endpointhttp://localhost:8080/api/v1/items?itemIds=“URLEncoder.encode(itemIds,“UTF-8”)在Postman中运行良好。itemIds是一个逗号分隔的列表,如下所示:

540002891454000291385400291385400291385400291385400291385400284015400002891854000280765400028726

我还尝试使用getForObject如下:

String result = restTemplate.getForObject(endpoint, String.class);

这给了我一个错误:

org.springframework.web.client.HttpClientErrorException: 415 Unsupported Media Type

我不确定我错过了什么或做错了什么,但相同的endpoint在Postman上工作得很好,但唯一的区别是我在Postman应用程序中添加了内容类型标题。

这是我从邮递员那里得到的请求:

GET /api/v1/items?itemIds=abc, def, ghi HTTP/1.1主机:localhost:8080连接:保活邮递员令牌: 84790e06-86aa-fa8a-1047-238d6c931a68缓存控制:无缓存用户代理: Mozilla/5.0(Macintosh; Intel Mac OS X10_11_6)AppleWebKit/537.36(KHTML, like Gecko)Chrome/56.0.2924.87Safari /537.36内容类型:应用程序/json接受:*/*接受-编码: gzip,缩小, sdch接受-语言: en-US, en; q=0.8, zh-CN; q=0.6, zh; q=0.4

那么,如果我的上面的代码是错误的,我如何正确地使用RestTemboard设置内容类型呢?

另一个深潜,我已经启动了Wireshark来捕获两个HTTP请求,以下是屏幕截图:

我仍然不明白为什么我Java程序中的一个抛出400,而Postman程序中的一个运行良好。

谢谢。

共有2个答案

胥智
2023-03-14

GET方法不需要设置“requestEntity”,请尝试以下代码:

public ItemInfo getItemInfo() throws Exception {
    String url =
            "http://localhost:8080/api/v1/items?itemIds=abc";
    ObjectMapper objectMapper = new ObjectMapper();     
    ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, null, String.class);
    String responseBody = response.getBody();
    handlerError(response, url);
    try {
        return objectMapper.readValue(responseBody, ItemInfo.class);
    } catch (IOException exception) {
        LOGGER.error("failed to send REST request", exception);
        throw new Exception(ErrorCode.NOT_AVAILABLE, url);
    }
}

private void handlerError(final ResponseEntity<String> response, final String url) throws Exception {
    String responseBody = response.getBody();
    try {
        if (RestUtil.isError(response.getStatusCode())) {
            ObjectMapper objectMapper = new ObjectMapper(); 
            MyInfoError myInfoError = objectMapper.readValue(responseBody, MyInfoError.class);
            throw new Exception(infoErreur, ErrorCode.UNKNOWN_CODE_ERROR);
        } else if (RestUtil.isNotFound(response.getStatusCode())) {
            throw new Exception(ErrorCode.NOT_AVAILABLE, "MyService");
        }
    } catch (IOException exception) {
        LOGGER.error("failed to send REST request", exception);
        throw new Exception(ErrorCode.NOT_AVAILABLE, url);
    }
}

我把它NULL,因为GET方法不发送任何JSON请求正文/标头:

restTemplate.exchange(url, HttpMethod.GET, null, String.class);

或者:将标题放在GET方法中,如下所示:

RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
HttpEntity<?> requestEntity = new HttpEntity<>(headers);
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class);

例如,对于POST,您需要如下设置requestEntity:

ItemFormRequest request =
            new ItemFormRequest(1,"item no", "item name");
HttpEntity<ItemFormRequest> requestEntity = new HttpEntity<>(request);
        ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class);
        String responseBody = response.getBody();

希望这有帮助:)

居琛
2023-03-14

好的,最终,我的一位同事帮我弄明白了原因,信不信由你,原因很简单:

endpoint是这样的:"超文本传输协议:localhost:8080/api/v1/items?itemIds="URLEncoder.encode(itemIds,"UTF-8");

但是,它应该是http:localhost:8080/api/v1/items?itemIds=“itemIds

itemIds只是一个逗号分隔的列表。

通过UTF-8模式进行URLEncoder编码后,这个逗号分隔的列表变为itemIds=5400028914,5400029138,5400029138,5400029138,5400029138,5400028401,5400028918,5400028076

从…起

itemIds=54000289145400029138540029138540029138540029138540028401540002891854000280765400028726

在使用RestTemplate时,我们不需要使用URLEncoder来编码URL,任何人都可以在这里帮助我加深理解吗?

谢谢

 类似资料:
  • 在使用RestTemplate发送POST请求时,我一直收到400个错误请求。这是我的密码: 我试图实现的是转换ff。spring的php代码: 有什么不对劲吗?请注意,我发布到一个外部链接(API),它是HTTPS。

  • 当我尝试执行请求时,我不断收到以下异常。对url的直接curl请求可以正常工作,但实际上不行。我正在尝试从端口上的服务调用端口上的服务。 密码 卷曲 错误

  • 我正在尝试使用Spring RestTemboard获取Twitter推文。我的代码如下: 我遇到以下错误: 异常线程"main"org.springframework.web.client.HttpClientError异常: 401授权需要在org.springframework.web.client.DefaultResorseErrorHandler.handle错误(DefaultRes

  • 问题内容: 我有一个包含表单(帖子)的html。单击某些提交按钮时,我会收到JSON响应。 如何获取此JSON? 如果我不截取请求,则json将显示在Web视图上,所以我想应该使用(我正在使用API​​ 12),但是我不知道如何在其中获取json。 还是有更好的方法,例如拦截响应而不是请求? 谢谢 问题答案: 您应该重写的方法

  • 问题内容: 这是我的javascript: 这是我的控制器: spring-servlet.xml 出现此错误: 标头: 响应标题 请求标题 有趣的注意事项: 我收到406错误,但hibernate查询同时起作用。 每当我在保管箱中更改选择时,这就是tomcat日志所说的: 可能是什么问题?之前在SO中有两个类似的问题,我在那里尝试了所有被接受的提示,但是我想它们没有用… 有什么建议么?随意问的问

  • 我需要帮助发送请求到FTP服务器下载文件...我已经写了下面的代码下载一个文件使用HTTP它工作成功,但我不知道如何做一个FTP.....由于我已经使用套接字来建立连接,它必须通过这种方式来完成,请建议我下载一个FTP文件的请求(发送到服务器)的格式是什么...... ///////////////编码////////////////////////////////////////////////