Spring Boot 如何使用application/x-www-form-urlencoded发送Http POST请求

myzjeezk  于 2022-11-23  发布在  Spring
关注(0)|答案(1)|浏览(367)

我尝试从外部网站生成令牌,发布请求必须是application/x-www-form-urlencoded,但我收到错误。我假设我没有正确调用内容类型application/x-www-form-urlencoded,但我不知道如何调用!!PS:我使用的是带有java 8的springboot
代码如下:

public String getNewAccesToken() {

        //Initilazing variabels
        try {

            JsonObject properties = new JsonObject();

            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
            headers.set("Cookie", cookie);
            properties.addProperty("client_id", clientId);
            properties.addProperty("client_secret", clientSecret);
            properties.addProperty("grant_type", grantType);
            
            HttpEntity<String> requestEntity = new HttpEntity<>(properties.toString(), headers);
            log.debug(requestEntity);
            ResponseEntity<String> response = restTemplate.exchange(requestUrl, HttpMethod.POST, requestEntity,
                    String.class);
            

            log.debug("---------------------------------");
            log.debug(response);
            if (Util.isJSONValid(response.getBody())) {
                JsonParser parser = new JsonParser();
                JsonObject jsonString = (JsonObject) parser.parse(response.getBody());
                return jsonString.get("accessToken").getAsString();
            } else {

                error.setCode(ConstantGateway.JSON_ERROR_CODE);
                error.setMessage(ConstantGateway.JSON_ERROR_STATUS);
                return error.toString();
            }
        } catch (HttpStatusCodeException e) {
            error.setCode(String.valueOf(e.getStatusCode().value()));
            error.setMessage(e.getResponseBodyAsString());
            return error.toString();
        } catch (Exception e) {
            // TODO: handle exception
            error.setCode(ConstantGateway.IL_INTERNAL_ERROR_CODE);
            error.setMessage(e.getMessage());
            return error.toString();
        }

    }

下面是调用这个函数时得到的结果:
org.zwz.vas.internal.api.model.ErrorModel@16dd359c
然而,当我打电话给 Postman 时,我得到的正确回答是:

{
    "access_token": "RdWt3DNIfxmihnubGX0Fgfcb0KNHLZV79OfN9Y6Ky6Z3fxAfF_Pm7uP0jnFrG1fHplyBMZ74BIKleQ8jmswdGy4e87NV-uZsMzgS1nQAONc2nBxgU1_jkMBhL4vvIniJNd99oYNzGeanCYYki0yorrrlLrOGTncusv1BgFFHU_CBGuUtGmZYLfJAJW4XcZLhXMC9xpT2aWAvgRXZW69pOhfU1Fgs7aVwou85UVI2b4j1GfX0pCtJtluiTgXsuWqdck7_at1dqfopHpjWAywYrweStMXGm8T59nyQi_oXWmo",
    "token_type": "bearer",
    "expires_in": 1199
}

先谢谢你

quhf5bfb

quhf5bfb1#

我发现了我的错误,我发送了一个错误的请求格式,它与application/x-www-form-urlencoded类型不兼容。正确的代码如下:

HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
            headers.set("Cookie", cookie);
            
            MultiValueMap<String, String> properties= new LinkedMultiValueMap<String, String>();
            
            properties.add("client_id", clientId);
            properties.add("client_secret", clientSecret);
            properties.add("grant_type", grantType);
    
            HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(properties, headers);

            ResponseEntity<String> response = restTemplate.postForEntity( requestUrl, request , String.class );

相关问题