HTTP传输和HTTP请求

3

我正在尝试使用HTTP请求从API获取JSON数据。但是,我仍然无法设置请求。这是我的当前代码:

HttpTransport transport = new HttpTransport() {
    @Override
    protected LowLevelHttpRequest buildRequest(String s, String s1) throws IOException {
        return null;
    }
};

我被迫创建一个HTTP传输对象,但是我不知道该放什么内容,文档也没有给我任何提示。

@Override
public void action(String[] args, MessageReceivedEvent event) {
    HttpRequest request=new HttpRequest(transport,"GET");
    request.setUrl(url);
    request.setConnectTimeout(5000);
    try {
        request.execute();
    }
    catch (IOException e) {
        e.printStackTrace();
    }
}

网址已经包含用于授权的Json Web Token。

但是,在初始化HttpRequest时,它给了我以下错误:

'HttpRequest(com.google.api.client.http.HttpTransport, java.lang.String)' is not public
in 'com.google.api.client.http.HttpRequest'.
Cannot be accessed from outside package

即使我清除括号,也无法消除这个错误:
HttpRequest request=new HttpRequest();

有人知道我做错了什么吗?

更新:我已经修复了我的代码,但仍然出现错误:

HttpTransport transport = new ApacheHttpTransport();
    HttpRequestFactory requestFactory = transport.createRequestFactory();
    try {
        HttpRequest request = requestFactory.buildGetRequest(url);
        request.execute();
        System.out.println(request.getContent());
    }
    catch (IOException e){
        e.printStackTrace();
    }

The error I get shown is:

avax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

编辑:即使我使用下面的示例,它也会返回此错误。

2
HttpTransport 是一个抽象类,因此您需要使用它的其中一个具体实现,例如 _ApacheHttpTransport_。请参见 https://developers.google.com/api-client-library/java/google-http-java-client/reference/1.20.0/com/google/api/client/http/HttpTransport。 - zeppelin
我已经将HttpTransport替换为ApachHttpTransport,但似乎没有改变任何东西... - Werner der Champ
1个回答

2
这意味着`HttpRequest`构造函数是受保护的,无法直接调用。你需要使用`HttpRequestFactory`工厂来创建一个`HttpRequest`实例。
要获取`HttpRequestFactory`,你需要先拥有`HttpTransport`,详见https://developers.google.com/api-client-library/java/google-http-java-client/reference/1.20.0/com/google/api/client/http/HttpTransport
HttpTransport transport = new ApacheHttpTransport();
HttpRequestFactory requestFactory = transport.createRequestFactory();
HttpRequest request = requestFactory.buildGetRequest(url);
HttpResponse response = request.execute();
     try {
       // process the HTTP response object
           InputStream is = response.getContent();
           try {
               // Process the input stream..
           } finally {
               is.close();
           }
     } finally {
       response.disconnect();
     }

从未尝试过这个例子,希望它能够正常工作。


似乎可以工作。 但是有两个问题:
  1. 我必须将URL放在_requestBody_中吗?您已经在其中放置了JSON,这并不清楚。
  2. JSON之后存储在哪里?在_transport_中吗?
- Werner der Champ
1
我犯了一个错误,那是一个POST请求。你需要调用GET,所以根本不必提供正文内容。我已经更改了示例。 - Milan Baran
我已经添加了你的代码,并添加了System.out.println(request.getContent());以查看响应。但是响应为_null_。当我直接在浏览器中输入URL时,它可以工作。 - Werner der Champ
好的,你需要调用 request.execute() 方法,它会返回一个 response 对象,其中包含所需的内容。 - Milan Baran
1
哦,伙计,我要替你谷歌一下吗? :) http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientCustomSSL.java - Milan Baran
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接