首页 > 解决方案 > 使用 RestTemplate POST 方法仅使用查询参数发布请求

问题描述

我正在尝试使用 POST 方法调用 API。其中没有正文,只有 URL 中的所有参数。

这就是我构建通过okHttpClient版本调用的请求的方式:

Request requestToken = new Request.Builder()
                .url(TOKEN_GEN_API_URL + ConfigConstants.TOKEN_CLIENT_ID_PARAM
                        + TOKEN_CLIENT_ID_PARAM_VALUE + ConfigConstants.TOKEN_CLINET_SECRET_PARAM
                        + TOKEN_CLIENT_SECRET_PARAM_VALUE + ConfigConstants.TOKEN_GRANT_TYPE_PARAM
                        + TOKEN_GRANT_TYPE_PARAM_VALUE)
                .post(requestBody)
                .addHeader("Content-Type", "application/json")
                .addHeader("cache-control", "no-cache")
                .build();

配置常量类:

public class ConfigConstants {
    
    public static final String TOKEN_CLIENT_ID_PARAM = "?client_id=";
    public static final String TOKEN_CLINET_SECRET_PARAM = "&client_secret=";
    public static final String TOKEN_GRANT_TYPE_PARAM = "&grant_type=";
}

这将创建类似这样的 URL:

<endpoint>?client_id=...&client_secret=..&grant_type=..

现在,我正在尝试通过 RestTemplate 调用它,我认为它不会那么复杂。但是,我不确定如何在没有任何主体的情况下构建此请求。

@RestController
public class TokenRestAPI {
    
    @Autowired
    RestTemplate restTemplate;
    
    private static final Logger logger = LogManager.getLogger(TokenRestAPI.class);

    @Value("${TOKEN_CLIENT_SEC_PARAM_VALUE}")
    private String TOKEN_CLIENT_SECRET_PARAM_VALUE;

    @Value("${TOKEN_CLIENT_ID_PARAM_VALUE}")
    private String TOKEN_CLIENT_ID_PARAM_VALUE;

    @Value("${TOKEN_GRANT_TYPE_PARAM_VALUE}")
    private String TOKEN_GRANT_TYPE_PARAM_VALUE;


    @Value("${TOKEN_GEN_API_URL}")
    private String TOKEN_GEN_API_URL;
    
    
    @PostMapping("/")
    public void getAuthToken() {
        
        ResponseEntity<TokenPOJO> response = restTemplate.postForEntity(TOKEN_GEN_API_URL, request, TokenPOJO.class);
        
    }
    

}

标签: spring-boot

解决方案


如果您不想发送正文,只需将 null 作为请求对象传递:

ResponseEntity<TokenPOJO> response = restTemplate.postForEntity(TOKEN_GEN_API_URL, null, TokenPOJO.class);

您仍然必须构建 URL 或使用参数。最后,您可以通过将变量放入 url 字符串中来完成,例如:

String url = "http://example.com?foo={bar}"

并传递一个以变量名作为键、参数值作为值的映射。


推荐阅读