Как разместить запрос на Google Shrostener API с помощью Google API API -клиента и разобрать ответ JSON?

StackOverflow https://stackoverflow.com/questions/4724270

Вопрос

Я хочу использовать Google Shorkener API. Анкет Я хочу использовать клиентскую библиотеку Google API Java, чтобы опубликовать запрос и разобрать ответ JSON.

Далее я публикую код, который пробовал:

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();
        }
    } 
}

Когда я выполняю приведенный выше код, я получаю следующий вывод:

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)

Есть идеи, как правильно установить jsoncparser?

Путь ошибки

В начале я не устанавливал должным образом содержание запроса. Как указано @DWB, содержимое запроса должно быть установлено:

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

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

request.content = content;

Если вы не установите контент должным образом, вы получите следующую ошибку

com.google.api.client.http.httpresponsexexception: 411, требуемая на com.google.api.client.http.httprequest.execute (httprequest.java:209) на Googleshortener.main (googleshortener.java:32)

Это было полезно?

Решение

Вам нужно добавить контент JSON в тело запроса, как это:

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

Для ответа попробуйте использовать jsonhttpparser вместо jsoncparser. Вам нужно будет создать подкласс Genericjson, который содержит поля с аннотацией @Key для каждого свойства JSON, которое вы хотите получить. Вы можете использовать response.parseasString (), чтобы увидеть все доступные свойства.

Вот полный рабочий пример:

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;
    }
}

Другие советы

Код, указанный DWB, является правильным, но он использует устаревшие методы API клиента Google.

Реализация с текущей поддержкой библиотеки выглядит следующим образом:

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.jackson.JacksonFactory;
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 JacksonFactory());
        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 JacksonFactory(), 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;
    }

}

Примечание. Вы должны использовать свои учетные данные OAuth 2.0 для использования сервисов Google API.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top