簡體   English   中英

如何使用 Java 調用支持 RQL(資源查詢語言)的 REST API

[英]How to call REST API which supports RQL (Resource Query Language) using Java

我正在嘗試使用 Java 來消耗 REST API。 使用 Oauth1 進行身份驗證。 代碼塊如下 -

import java.io.InputStream;
import java.io.StringWriter;
import java.net.URI;
import java.net.URISyntaxException;
import oauth.signpost.OAuthConsumer;
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
import oauth.signpost.exception.OAuthCommunicationException;
import oauth.signpost.exception.OAuthExpectationFailedException;
import oauth.signpost.exception.OAuthMessageSignerException;
import oauth.signpost.signature.AuthorizationHeaderSigningStrategy;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.impl.client.DefaultHttpClient;
import javax.swing.text.html.FormSubmitEvent;

public class Oauth1RestCallWithOutToken {
    private OAuthConsumer oAuthConsumer;

    public Oauth1RestCallWithOutToken() {
        String consumerKey = "my_consumer_key";
        String consumerSecret = "my_consumer_secret";
        setupContext(consumerKey, consumerSecret);
    }

    public void setupContext(String consumerKey, String consumerSecret) {
        this.oAuthConsumer = new CommonsHttpOAuthConsumer(consumerKey, consumerSecret);
        //oAuthConsumer.setTokenWithSecret("", "");
        oAuthConsumer.setSigningStrategy(new AuthorizationHeaderSigningStrategy());
    }

    public void authorize(HttpRequestBase httpRequest)  {
        try {
            oAuthConsumer.sign(httpRequest);
        } catch (OAuthMessageSignerException e) {

        } catch (OAuthExpectationFailedException e) {

        } catch (OAuthCommunicationException e) {

        }
    }

    public void executeGetRequest(String customURIString){
        DefaultHttpClient client = new DefaultHttpClient();
        client.getParams().setParameter("http.protocol.content-charset", "UTF-8");

        HttpRequestBase httpRequest = null;
        URI uri = null;

        try {
            uri = new URI(customURIString);
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

        String methodtype = "GET";

        if (methodtype.equals(FormSubmitEvent.MethodType.GET.toString())) {
            httpRequest = new HttpGet(uri);
        }

        httpRequest.addHeader("content-type", "application/json");
        httpRequest.addHeader("Accept","application/json");

        try {
            authorize(httpRequest);
        } catch (Exception e) {
            e.printStackTrace();
        }


        HttpResponse httpResponse = null;
        try {
            HttpHost target = new HttpHost(uri.getHost(), -1, uri.getScheme());
            httpResponse = client.execute(target, httpRequest);
            System.out.println("Connection status : " + httpResponse.getStatusLine());

            InputStream inputStraem = httpResponse.getEntity().getContent();

            StringWriter writer = new StringWriter();
            IOUtils.copy(inputStraem, writer, "UTF-8");
            String output = writer.toString();

            System.out.println(output);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public static void main(String args[]) {
        String url="https:host/order-manager/orders";
        //url="https:host/order-manager/orders?in(internalId,12345)";
        Oauth1RestCallWithOutToken withoutDevkitClient = new Oauth1RestCallWithOutToken();
        withoutDevkitClient.executeGetRequest(url);
    }

}

依賴項-

<dependencies>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpcore</artifactId>
            <version>4.3.1</version>
        </dependency>
        <dependency>
            <groupId>oauth.signpost</groupId>
            <artifactId>signpost-core</artifactId>
            <version>1.2.1.1</version>
        </dependency>
        <dependency>
            <groupId>oauth.signpost</groupId>
            <artifactId>signpost-commonshttp4</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>4.3.1</version>
        </dependency>
    </dependencies>

如果使用 URL 之類的“ https:host/order-manager/orders ”,我會得到成功的響應。 但是,如果使用 URL 之類的“ https:host/order-manager/orders?in(internalId,12345) ”,我會收到 500 個響應,其中包含 RQL 參數。 從 Postman 或 Insomnia 消費時,這兩個 URL 都工作正常。
你能幫我指出我的錯誤嗎? 或使用 java 使用支持 RQL 的任何建議。 提前致謝。

終於得到了解決方案。 代碼如下 -

import java.io.InputStream;
import java.io.StringWriter;
import java.net.URI;
import java.net.URISyntaxException;
import com.google.api.client.auth.oauth.OAuthHmacSigner;
import com.google.api.client.auth.oauth.OAuthParameters;
import com.google.api.client.http.GenericUrl;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.impl.client.DefaultHttpClient;
import javax.swing.text.html.FormSubmitEvent;

public class Oauth1RQLRestCallWithOutToken {
    private final String consumerKey = "consumerKey";
    private final String consumerSecret = "consumerSecret";

    public void executeGetRequest(String customURIString){
        DefaultHttpClient client = new DefaultHttpClient();
        client.getParams().setParameter("http.protocol.content-charset", "UTF-8");

        HttpRequestBase httpRequest = null;
        URI uri = null;

        try {
            uri = new URI(customURIString);
        } catch (URISyntaxException e) {
            e.printStackTrace();
        }

        String methodtype = "GET";

        if (methodtype.equals(FormSubmitEvent.MethodType.GET.toString())) {
            httpRequest = new HttpGet(uri);
        }

        httpRequest.addHeader("content-type", "application/json");
        httpRequest.addHeader("Accept","application/json");

        //Generate Authorization header
        try{
            String headerValue=getAuthorizationHeader(customURIString,methodtype);
            httpRequest.setHeader("Authorization",headerValue);
        }catch (Exception ex){
            System.out.println("Error: "+ex.getMessage());
        }


        HttpResponse httpResponse = null;
        try {
            HttpHost target = new HttpHost(uri.getHost(), -1, uri.getScheme());
            httpResponse = client.execute(target, httpRequest);
            System.out.println("Connection status : " + httpResponse.getStatusLine());

            InputStream inputStraem = httpResponse.getEntity().getContent();

            StringWriter writer = new StringWriter();
            IOUtils.copy(inputStraem, writer, "UTF-8");
            String output = writer.toString();

            System.out.println(output);
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    private  String getAuthorizationHeader(String url, String method) throws Exception {
        OAuthParameters oauthParams = new OAuthParameters();
        oauthParams.version = "1.0";
        oauthParams.consumerKey = consumerKey;
        oauthParams.computeNonce();
        oauthParams.computeTimestamp();

        OAuthHmacSigner oauthSigner = new OAuthHmacSigner();
        oauthSigner.clientSharedSecret = consumerSecret;

        oauthParams.signer = oauthSigner;
        oauthParams.computeSignature(method,
                new GenericUrl(url)
        );

        return oauthParams.getAuthorizationHeader();
    }

    public static void main(String args[]) {
        String url="https:host/order-manager/orders";
        url="https:hosts/order-manager/orders?in(internalId,12345)";
        Oauth1RQLRestCallWithOutToken rqlRestCallWithOutToken = new Oauth1RQLRestCallWithOutToken();
        rqlRestCallWithOutToken.executeGetRequest(url);
    }    
}

依賴項-

<dependencies>
    <dependency>
            <groupId>com.google.http-client</groupId>
            <artifactId>google-http-client</artifactId>
            <version>1.38.1</version>
    </dependency>
    <dependency>
            <groupId>com.google.oauth-client</groupId>
            <artifactId>google-oauth-client</artifactId>
            <version>1.31.4</version>
    </dependency>
    <dependency>
            <groupId>com.intuit.quickbooks-online</groupId>
            <artifactId>ipp-v3-java-devkit</artifactId>
            <classifier>jar-with-dependencies</classifier>
            <version> 6.0.7 </version>
     </dependency>
</dependencies>

暫無
暫無

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

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