如何使用 Google API Java 客户端向 Google Shortener API POST 请求并解析 JSON 响应?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/4724270/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 07:43:28  来源:igfitidea点击:

How to POST request to Google Shortener API with Google API Java Client and parse a JSON response?

javagoogle-api-java-clientgoogle-url-shortener

提问by Sergio del Amo

I want to use the Google Shortener API. I want to use the google api java client library to post a request and parse the JSON response.

我想使用Google Shortener API。我想使用 google api java 客户端库来发布请求并解析 JSON 响应。

Next, I post the code I have tried:

接下来,我贴出我试过的代码:

import java.io.IOException; 
import net.sf.json.JSONObject; 
import com.google.api.client.googleapis.GoogleHeaders; 
import com.google.api.client.googleapis.GoogleTransport; 
import com.google.api.client.googleapis.json.JsonCParser; 
import com.google.api.client.http.HttpRequest; 
import com.google.api.client.http.HttpResponse; 
import com.google.api.client.http.HttpTransport; 
import com.google.api.client.json.JsonHttpContent; 
import com.google.api.client.util.GenericData;


public class GoogleShortener {  
public static final String GOOGL_URL = "https://www.googleapis.com/urlshortener/v1/url";

    public static void main(String[] args) {    
        // setup up the HTTP transport
        HttpTransport transport = GoogleTransport.create();
        // add default headers
        GoogleHeaders defaultHeaders = new GoogleHeaders();
        transport.defaultHeaders = defaultHeaders;
        transport.defaultHeaders.put("Content-Type", "application/json");
        transport.addParser(new JsonCParser());
        // build the HTTP GET request and URL

        GenericData data = new GenericData();
        data.put("longUrl", "http://www.google.com/");

        JsonHttpContent content = new JsonHttpContent();
        content.data = data;

        HttpRequest request = transport.buildPostRequest();
        request.content = content;
        request.setUrl(GOOGL_URL);
        HttpResponse response;
        try {
            JSONObject json = request.execute().parseAs(JSONObject.class);      
        } catch (IOException e) {           
           // TODO Auto-generated catch block                                
           e.printStackTrace();
        }
    } 
}

When I execute the above code, I get the next output:

当我执行上面的代码时,我得到了下一个输出:

Exception in thread "main" java.lang.IllegalArgumentException: data key not found
    at com.google.api.client.googleapis.json.JsonCParser.parserForResponse(JsonCParser.java:77)
    at com.google.api.client.googleapis.json.JsonCParser.parse(JsonCParser.java:47)
    at com.google.api.client.http.HttpResponse.parseAs(HttpResponse.java:261)
    at GoogleShortener.main(GoogleShortener.java:43)

Any idea how to set the JsonCParser properly?

知道如何正确设置 JsonCParser 吗?

ERROR PATH

错误路径

In the beginning I was not setting properly the request content. As pointed by @dwb, the request content should be set:

一开始我没有正确设置请求内容。正如@dwb 所指出的,应该设置请求内容:

GenericData data = new GenericData();
data.put("longUrl", "http://www.google.com/");

JsonHttpContent content = new JsonHttpContent();
content.data = data;

request.content = content;

If you do not set the content properly, you will get the next error

如果你没有正确设置内容,你会得到下一个错误

com.google.api.client.http.HttpResponseException: 411 Length Required at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:209) at GoogleShortener.main(GoogleShortener.java:32)

com.google.api.client.http.HttpResponseException: 411 长度需要在 com.google.api.client.http.HttpRequest.execute(HttpRequest.java:209) 在 GoogleShortener.main(GoogleShortener.java:32)

回答by dwb

You need to add JSON content to the request body like this:

您需要像这样将 JSON 内容添加到请求正文中:

GenericData data = new GenericData();
data.put("longUrl", "http://www.google.com/");
JsonHttpContent content = new JsonHttpContent();
content.data = data;
request.content = content;

For the response, try using the JsonHttpParser instead of JsonCParser. You'll need to create a subclass of GenericJson that contains fields with a @Key annotation for every JSON property you want to retrieve. You can use response.parseAsString() to see all of the properties available.

对于响应,请尝试使用 JsonHttpParser 而不是 JsonCParser。您需要创建 GenericJson 的子类,其中包含带有 @Key 注释的字段,用于您要检索的每个 JSON 属性。您可以使用 response.parseAsString() 来查看所有可用的属性。

Here's a full working example:

这是一个完整的工作示例:

import com.google.api.client.googleapis.GoogleHeaders;
import com.google.api.client.googleapis.GoogleTransport;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpResponse;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.GenericJson;
import com.google.api.client.json.JsonHttpContent;
import com.google.api.client.json.JsonHttpParser;
import com.google.api.client.util.GenericData;
import com.google.api.client.util.Key;


public class Shortener {

    public static final String GOOGL_URL = "https://www.googleapis.com/urlshortener/v1/url";

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        // setup up the HTTP transport
        HttpTransport transport = GoogleTransport.create();
        // add default headers
        GoogleHeaders defaultHeaders = new GoogleHeaders();
        transport.defaultHeaders = defaultHeaders;
        transport.defaultHeaders.put("Content-Type", "application/json");
        transport.addParser(new JsonHttpParser());

        // build the HTTP GET request and URL
        HttpRequest request = transport.buildPostRequest();
        request.setUrl(GOOGL_URL);
        GenericData data = new GenericData();
        data.put("longUrl", "http://www.google.com/");
        JsonHttpContent content = new JsonHttpContent();
        content.data = data;
        request.content = content;

        HttpResponse response = request.execute();
        Result result = response.parseAs(Result.class);

        System.out.println(result.shortUrl);
    }

    public static class Result extends GenericJson {        
        @Key("id")
        public String shortUrl;
    }
}

回答by The-Proton-Resurgence

The code given by dwb is correct but it is using deprecated methods of the google client api.

dwb 给出的代码是正确的,但它使用的是谷歌客户端 api 的弃用方法。

Implementation with current library support is as follows :

当前库支持的实现如下:

import java.util.HashMap;
import java.util.Map;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpContent;
import com.google.api.client.http.HttpHeaders;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpResponse;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.json.JsonHttpContent;
import com.google.api.client.json.GenericJson;

import com.google.api.client.json.JsonObjectParser;
import com.google.api.client.json.Hymanson.HymansonFactory;
import com.google.api.client.util.Key;

public class ShortenUrl {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {

        HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();

        HttpHeaders headers = new HttpHeaders();
        JsonObjectParser parser = new JsonObjectParser(new HymansonFactory());
        GenericUrl url = new GenericUrl("https://www.googleapis.com/urlshortener/v1/url");

        Map<String, String> json = new HashMap<String, String>();
        json.put("longUrl", "http://www.google.com/");

        final HttpContent content = new JsonHttpContent(new HymansonFactory(), json);

        HttpRequest request = httpTransport.createRequestFactory().buildPostRequest(url, content);

        try {

            HttpResponse response = request.execute();
            Result result = response.parseAs(Result.class);
            System.out.println(result.shortUrl);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static class Result extends GenericJson {
        @Key("id")
        public String shortUrl;
    }

}

Note : You should use your Oauth 2.0 credentials to use google api services.

注意:您应该使用 Oauth 2.0 凭据来使用 google api 服务。