How to POST request to Google Shortener API with Google API Java Client and parse a JSON response?
Solution 1
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;
}
}
Solution 2
The code given by dwb is correct but it is using deprecated methods of the google client 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.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;
}
}
Note : You should use your Oauth 2.0 credentials to use google api services.
Sergio del Amo
Updated on June 07, 2022Comments
-
Sergio del Amo about 2 years
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)