簡體   English   中英

使用 webclient 使用 get API

[英]consuming get API using webclient

當我從postman調用時,我的API返回以下response 我沒有從 webclient 得到適當的響應。 我做錯了什么。 我很新。

{
    "loginAccounts": [
        {
            "name": "Oracle",
            "accountId": "16485679",
            "baseUrl": "https://demo.docusign.net/restapi/v2.1/accounts/16485679",
            "isDefault": "true",
            "userName": "Mahima Pandey",
            "userId": "e48dbc73-97df-42de-be9f-ea49c8b24712",
            "email": "mahima.pandey@oracle.com",
            "siteDescription": ""
        }
    ]
}

當我使用 webclient 消費時。

public static Flux<LoginAccounts> retrieveDetails(){
        Flux<LoginAccounts> loginAccounts=null;
        WebClient webclient = WebClient.create();
        try {
        loginAccounts = webclient.get().uri(DocusignConstants.LOGIN_INFO_URL)
                .header("Accept", "application/json")
                .header("Authorization", "Bearer eyJ0eX...........")
                .retrieve()
                .bodyToFlux(LoginAccounts.class);
        System.out.println(loginAccounts);
        }
        catch(WebClientResponseException ex) {
            System.out.println(ex);
        }
        return loginAccounts;
    }

重新處理MonoFlatMapMany很簡單。我怎樣才能得到正確的響應?

我的 POJO 在下面。

@data
@Noargsconstructor
@Allargsconstructor
public class LoginAccounts {

    private String name;
    private String accountId;
    private String baseUrl;
    private Boolean isDefault;
    private String userName;
    private String userId;
    private String email;
    private String siteDescription;

}

如果我寫這行System.out.println(loginAccounts); 它打印

MonoFlatMapMany

但如果我使用 stram 它開始給出異常

loginAccounts.toStream().forEach(data -> System.out.println(data));

下面是例外。

org.springframework.web.reactive.function.client.WebClientRequestException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; nested exception is javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
2022-06-21 11:09:50.494  WARN 20024 --- [ctor-http-nio-2] r.netty.http.client.HttpClientConnect    : [099818dc, L:/172.20.10.3:58444 - R:demo.docusign.net/162.248.186.25:443] The connection observed an error

javax.net.ssl.SSLHandshakeException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131) ~[na:na]
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:371) ~[na:na]
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:314) ~[na:na]
    at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:309) ~[na:na]
    at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.checkServerCerts(CertificateMessage.java:1357) ~[na:na]
    at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.onConsumeCertificate(CertificateMessage.java:1232) ~[na:na]
    at java.base/sun.security.ssl.CertificateMessage$T13CertificateConsumer.consume(CertificateMessage.java:1175) ~[na:na]
    at java.base/sun.security.ssl.SSLHandshake.consume(SSLHandshake.java:396) ~[na:na]
    at java.base/sun.security.ssl.HandshakeContext.dispatch(HandshakeContext.java:480) ~[na:na]
    at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1277) ~[na:na]
    at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask$DelegatedAction.run(SSLEngineImpl.java:1264) ~[na:na]
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:712) ~[na:na]
    at java.base/sun.security.ssl.SSLEngineImpl$DelegatedTask.run(SSLEngineImpl.java:1209) ~[na:na]

從郵遞員那里我得到了適當的回應。

在此處輸入圖像描述

而不是使用System.out.println來打印輸出。 您可以使用循環來打印值。

試試下面的代碼:

loginAccounts.toStream().forEach(data -> System.out.println(data));

首先,您應該使用 SSL 解決您的問題。 因此,將您的 SSL 證書導入您的 certstore( 在此處獲取靈感)。

第二件事是,如果您正在使用Flux ,這並不意味着可以立即獲得響應。 你應該以某種方式得到它。 你可以做類似的事情

List<LoginAccounts> accounts = loginAccounts.collectList().block();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM