Search code examples
javagoogle-api-java-clientgoogle-url-shortener

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


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.

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?

ERROR PATH

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

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)


Solution

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

    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.

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