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

SPRING BOOT: RestTem板postForObject 400错误请求

吴镜
2023-03-14

在使用RestTemplate发送POST请求时,我一直收到400个错误请求。这是我的密码:

    MultiValueMap<String, Object> requestBody = new LinkedMultiValueMap<String, Object>();
    requestBody.add("message_id", "msgid");
    requestBody.add("message", "qwerty");
    requestBody.add("client_id", "111");
    requestBody.add("secret_key", "222");

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

    HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<MultiValueMap<String, String>>(requestBody, headers);

    RestTemplate restTemplate = new RestTemplate();
    String response = restTemplate.postForObject("https://abc.com/api/request", httpEntity, String.class);
    JSONParser parser = new JSONParser();
    try {
        JSONObject jsonObject = (JSONObject) parser.parse(response);
        System.out.println(jsonObject.get("status"));
    } catch (ParseException e) {
        e.printStackTrace();
    }

我试图实现的是转换ff。spring的php代码:

<?php
$arr_post_body = array(
  "message_id" => "qwerty",
  "message" => "Welcome to My life!",
  "client_id" => "111",
  "secret_key" => "222"
);

$query_string = "";
foreach($arr_post_body as $key => $frow)
{
    $query_string .= '&'.$key.'='.$frow;
}

$URL = "https://abc.com/api/request";
$curl_handler = curl_init();
curl_setopt($curl_handler, CURLOPT_URL, $URL);
curl_setopt($curl_handler, CURLOPT_POST, count($arr_post_body));
curl_setopt($curl_handler, CURLOPT_POSTFIELDS, $query_string);
curl_setopt($curl_handler, CURLOPT_RETURNTRANSFER, TRUE);
$response = curl_exec($curl_handler);
curl_close($curl_handler);
exit(0);

?>

有什么不对劲吗?请注意,我发布到一个外部链接(API),它是HTTPS。

共有3个答案

陆博易
2023-03-14

正如The Saint和RE350所解释的,这很可能是HTTP头问题。下面是我解决的方法。

使用Postman(chrome)进行HTTP调用(与要使用RestTemboard执行的调用相同)。它应该是成功的。打开检查元素工具的网络选项卡,检查HTTP请求的标头。

将Eclipse的TCP/IP监视器配置为监视localhost:8081,并在代码中用localhost:8081替换restTemplate的目标url<代码>restTemplate。交换(”http://localhost:8081,HttpMethod.POST,httpEntity,String.class) 运行你的应用程序;您将能够看到TCP/IP监视器中使用了哪些HTTP头。

从Zacran的帖子中获得配置标题的灵感。

祁俊拔
2023-03-14

任何时候,当你在使用Spring的REST模板的POST请求后期待/获取数据时,最好的方法是restTemplate.exchange(),而不是restTemplate.postForObject()

因此,您的代码应该如下所示:

HttpHeader headers = new HttpHeaders();
headers.add("Content-Type", MediaType.APPLICATION_JSON.toString());
headers.add("Accept", MediaType.APPLICATION_JSON.toString());

MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<String, String>();
requestBody.add("message_id", "msgid");
requestBody.add("message", "qwerty");
requestBody.add("client_id", "111");
requestBody.add("secret_key", "222");

HttpEntity formEntity = new HttpEntity<MultiValueMap<String, String>>(requestBody, headers);

ResponseEntity<AccessToken> response = 
                restTemplate.exchange("https://abc.com/api/request", HttpMethod.POST, 
                                      formEntity, YourPojoThatMapsToJsonResponse.class);

请在这里记下您的PojothatMapsToJSonResponse。最后一节课。exchange()方法将自动查看JSON响应,并尝试将其转换为已定义的映射到该JSON结构的POJO。换句话说,您应该已经创建了该类。如果没有,请使用JSONParser。类可能在您的情况下工作,但没有保证。

试试这个,让我知道进展如何。

唐威
2023-03-14

在HTTP头文件中添加accept和content-type后,您是否进行了测试,如下所示?

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

然后添加您的请求体,并使用RestTemboard调用postForObject。

 类似资料:
  • 在尝试使用时,我不断收到错误的请求错误。我尝试了和方法,但都没有成功,所以我做错了吗? 堆栈跟踪:(隐藏的api名称)

  • 我有一个基于Spring Web model view controller(MVC)框架的项目。Spring Web模型-视图-控制器(MVC)框架的版本是3.2.8 我有这个控制器 这个URL一切正常:

  • 目前从Angular JS controller中,我试图将JSON数据发送到后端服务。但是我有400个错误的请求错误。 在Controller中,我试图通过http服务发送数据,如下所示:

  • 我得到了这个错误,有什么想法会导致它吗?我试图发送一个DTO,它有一个扩展抽象类的对象列表,我想这个问题可能是因为DTO中的列表,还是因为抽象类的子类?

  • 我正在尝试搜索亚马逊的产品广告,并使用botlenose来帮助我做到这一点。但是,我刚刚收到HTTP错误400。 其他一些重要信息: 我来自巴西,我的标签也来自亚马逊。这是个问题吗? 我确实检查了我的钥匙、秘密和标签,一切正常。我确实在StackOverflow上查看了其他一些问题,但对我来说没有任何效果。 当然,出于安全原因,我更改了密钥。 Traceback(最近一次调用最后一次):File"

  • 我正在使用实现一个联系人应用程序。现在,我正试图通过发送以下格式的put请求来更新联系人 我将XML作为字符串发送,作为请求的主体。这是我的xmlString(请求主体) 我写了下面的代码来发送更新联系人的PUT请求。 当我试图在中发送请求时,联系人更新成功。但是当我试图运行上面的程序时,我得到了 400错误请求错误 我不知道我哪里出错了。任何帮助都将不胜感激!