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

如果请求包含JSON作为请求参数,则调用外部API会导致错误的请求

费朗
2023-03-14

我正在尝试使用RestTemplate将外部API集成到我的Spring MVC应用程序中。

除非我不必将JSON作为请求参数传递给API调用,否则它工作得非常好。这样的尝试每次都会导致400个错误请求,就我在API日志中查看的情况而言,我的JSON参数没有被API解码(它看起来仍然像编码字符串)。

我认为它可能与我请求中的标头有关,但一旦我添加了接受Content-Type,错误仍然相同。有人能给我一个建议我的实现可能有什么问题吗?

RestTemplate template = new RestTemplate();
MultiValueMap<String, String> body = new LinkedMultiValueMap<>();
body.add("Content-Type", "application/json");
body.add("Accept", "application/json");

UriComponentsBuilder urlBuilder = UriComponentsBuilder.fromHttpUrl(url);

String encodedParamValue = URLEncoder.encode(paramValue, "UTF-8");
urlBuilder.queryParam(requestParam, encodedParamValue);

HttpEntity<?> getRequest = new HttpEntity<>(body);

String response = template.exchange(urlBuilder.build().toString(), HttpMethod.GET, getRequest, String.class).getBody();

事实1我非常确定我的代码在连接APIendpoint和请求参数后产生的URL是OK的,因为留档显示了相同参数的完全相同的URL。

事实2:如果我html" target="_blank">调用一个不需要任何参数的不同endpoint(只是普通endpoint),那么它可以正常工作,所以我假设调用API的方式是正确的。

事实3就像我提到的,API日志显示,一旦我将参数URLEncoder.encode(参数值,“UTF-8”)编码,API“无法”将参数翻译(解码)为JSON。

共有1个答案

狄侯林
2023-03-14

你可以这样做:

 try {
        .......
        .......  
        HttpHeaders headers = new HttpHeaders();
        headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);
        // Set more header params as required ....
        HttpEntity entity = new HttpEntity<>(headers);

        RestTemplate restTemplate = new RestTemplate();
        response = restTemplate.exchange(url, HttpMethod.GET, entity, type);

        if(response.getStatusCode() == HttpStatus.OK) {
             //TODO: Need to modify response according to the demand
            if(response.getBody().getOk().equals("true") && response.getBody().getMessage() == null) {
                response.getBody().setMessage(successMessage);
            }

        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    .......
    .......
 类似资料:
  • 我有一个jersey服务器的例子,它适用于XML,但不适用于JSON。 如果我将此xml请求作为发送到服务器,则一切正常, 作为) 我在utilities-online.info将其翻译为JSON,并将其作为发送到相同的URL,具有相同的参数,但收到错误“400错误请求” 环境: Tomcat 7 球衣2.17 我尝试过的: 将添加到init-参数 启用init-参数为 添加了依赖项//

  • 我目前正在努力从API获取一些数据,但在一些请求中遇到了问题。 当前调用和其他一些类似的调用似乎不起作用,而其他调用则起作用(除了这些调用不使用“payload”参数)。我在文档中使用了相同的示例,因此不确定这些示例为什么不起作用。 回报 有人有主意吗?谢谢。

  • 我正在开发应用程序以从其他站点获取数据并显示在的html表中。 我使用Guzzes发送请求。(stackoverflow问题,最后使用Guzzes) 当我调用基于到外部API的请求时,它向我显示正确的数据! 我的问题是: 当我调用链接以获取laravel中的数据时,它会转到错误。 一些API地址只是在中工作, 我该怎么办?

  • 问题内容: 。我 试图通过Spring Android 从API 获取访问令牌。来自Instagram文档的请求是这样的: 这是我的请求访问令牌(成功获取请求令牌后): 结果映射类: 其余模板: 但是我总是收到400错误的请求错误。这是我的堆栈跟踪: P / s:我确定我的参数值正确,因为我通过curl进行了测试,并且效果很好。 问题答案: 如果请求的内容类型不可接受,则服务器通常会返回HTTP

  • 我有一个带有更新方法的控制器。该方法应在RequestBody中获取产品,但这会导致请求错误。我和邮递员一起发了一封邮件。JSON作为原始JSON发送,请求内容类型为application/JSON。 正文中的JSON是 请求响应不良的原因是什么?JSON似乎格式化正确,当没有正文时调用更新方法。

  • 我是REST API和JSON的新手,我有一个初学者的问题。我试图使用的API根据以下模式请求参数: 请求参数示例如下: 但是,当我试图使用SoapUI和Postman测试这个API时,我只看到参数的键值对,我不知道如何在病人对象中嵌套ID和类型: SoapUI参数 邮递员参数