Java Springboot WebClient取消订阅api

问题描述 投票:0回答:1

我正在使用 Java Spring boot - 我正在尝试完成 paypal 订阅 api 的集成。

我有一个在 WebClient 中工作的节目订阅计划 - 尽管我无法完成取消订阅方法的功能。

我得到一个 415 错误 --

“消息”:“来自 POST 的 415 不支持的媒体类型 https://api.sandbox.paypal.com/v1/billing/subscriptions/I-JJ0B8HRKSRYV/cancel”,

https://developer.paypal.com/api/rest/responses/

https://developer.paypal.com/docs/api/subscriptions/v1/#subscriptions_cancel - 当我查看 curl 方法时 - 它声称内容类型和接受在标题中 - 但它也可能是我尝试添加正文的方式?

//showSubscriptionDetails 方法

@CrossOrigin
@GetMapping("/api/showsubscriptiondetails")
@ResponseBody
public ResponseEntity<BaseResponse> showSubscriptionDetails(
        @RequestParam("subscriptionID") String subscriptionID
) throws PayPalRESTException {
    BaseResponse response = new BaseResponse();

    String bearerToken = generateAccessToken();
    String token = bearerToken.split(" ")[1].trim();

    WebClient client = WebClient.create(host);

    WebClient.ResponseSpec responseSpec = client.get()
            .uri("/v1/billing/subscriptions/"+subscriptionID+"?fields=plan")
            .headers(h -> {
                h.setBearerAuth(token);
            })
            .retrieve();

    String responseBody = responseSpec.bodyToMono(String.class).block();


    ObjectMapper mapper = new ObjectMapper();
    JsonNode root = null;
    try {
        root = mapper.readTree(responseBody);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    JsonNode status = root.path("status");
    JsonNode plan = root.path("plan").get("name");

    BasicDBObject res = new BasicDBObject();
    res.put("status", status);
    res.put("plan", plan);

    response.setCode("OK");
    response.setData(res);
    response.setDescription(appMessageLocalUtil.getLanguageMessage("subscription.found"));
    return ResponseEntity.ok().body(response);
}

//取消订阅方法

MultiValueMap<String, String> bodyValues = new LinkedMultiValueMap<>();
bodyValues.add("reason", "too expensive");


String bearerToken = generateAccessToken();
String token = bearerToken.split(" ")[1].trim();

WebClient client = WebClient.create(host);

WebClient.ResponseSpec responseSpec = client.post()
        .uri("/v1/billing/subscriptions/"+subscriptionID+"/cancel")
        .headers(h -> {
            h.setBearerAuth(token);
        })
        .retrieve();

String responseBody = responseSpec.bodyToMono(String.class).block();

System.out.println("responseSpec-- "+ responseSpec);
System.out.println("responseBody-- "+ responseBody);

...尝试

我尝试在标题中添加内容类型并作为主构建的一部分,但似乎没有通过。

       WebClient client = WebClient.create(host);

        WebClient.ResponseSpec responseSpec = client.post()
                .uri("/v1/billing/subscriptions/"+subscriptionID+"/cancel")
                .headers(h -> {
                    h.setBearerAuth(token);
                    //h.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
                    //h.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
                })
                .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                //.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE)
                //.contentType(MediaType.APPLICATION_FORM_URLENCODED)
                //.accept(MediaType.APPLICATION_JSON)
                .body(BodyInserters.fromFormData(bodyValues))
                .retrieve();

-- 2023 年 4 月 21 日

工作代码是这样的——使 body 成为一个对象并在 bodyinserter 中使用 fromValue——responseBody 在结果上为 null——但它确实取消了订阅 id

BasicDBObject body = new BasicDBObject();
body.put("reason", "xxx");

String bearerToken = generateAccessToken();
String token = bearerToken.split(" ")[1].trim();

WebClient client = WebClient.create(host);

WebClient.ResponseSpec responseSpec = client.post()
        .uri("/v1/billing/subscriptions/"+subscriptionID+"/cancel")
        .headers(h -> {
            h.setBearerAuth(token);
        })
        .contentType(MediaType.APPLICATION_JSON)
        .body(BodyInserters.fromValue(body))
        .retrieve();

String responseBody = responseSpec.bodyToMono(String.class).block();
System.out.println("responseSpec-- "+ responseSpec);
System.out.println("responseBody-- "+ responseBody);
java spring-boot paypal webclient
1个回答
0
投票

您链接到的 api 文档说取消正文是 json 并且包含 {“reason”: “too expensive”}。您正在发送表格。因此 415:form ≠ json.

试试这个:

String body = “{\”reason\”: \”too expensive\”}”;

WebClient client = WebClient.create(host);

        WebClient.ResponseSpec responseSpec = client.post()
   .uri("/v1/billing/subscriptions/"+subscriptionID+"/cancel")
            .headers(h -> {
                h.setBearerAuth(token);
            })
            .contentType(MediaType.APPLICATION_JSON)
            .body(BodyInserters.fromValue(body))
            .retrieve();
© www.soinside.com 2019 - 2024. All rights reserved.