当前位置: 首页 > 面试题库 >

如何使用Google API Java客户端将请求发布到Google Shortener API并解析JSON响应?

潘璞瑜
2023-03-14
问题内容

我想使用Google Shortener
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.HttpResponseException:411长度在GoogleShortener.main(GoogleShortener.java:32)的com.google.api.client.http.HttpRequest.execute(HttpRequest.java:209)处是必需的


问题答案:

您需要像这样将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的子类,该子类包含要检索的每个JSON属性带有@Key批注的字段。您可以使用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;
    }
}


 类似资料:
  • 客户端通过HTTP请求(通过浏览器post)调用Servlet,然后Servlet应向外部网站发送请求(get),并从网站接收响应(post)。servlet继续响应并向客户端发送响应(post)。 我的问题是如何在Servlet中发送和接收请求/响应并将某些内容发送回客户端?

  • 我正在关注Spotify的客户端凭据授权流,但我的所有curl请求每次都返回。以下是Spotify的说明: 请求将在请求正文中包含参数: grant_type-设置为“client_credentials” 此 POST 请求的标头必须包含以下参数: < li >授权-包含客户端ID和客户端密钥的Base 64编码字符串。该字段必须具有以下格式:<代码>授权:基本 它们还包括一个curl请求示例:

  • 问题内容: 我有类似以下内容: 它不断返回500。服务提供商说我需要发送JSON。Apache HttpClient 3.1+如何完成? 问题答案: Apache HttpClient对JSON一无所知,因此您需要分别构造JSON。为此,我建议从json.org检出简单的JSON- java 库。(如果“ JSON- java”不适合您,则json.org列出了大量可用不同语言提供的库。) 生成J

  • 问题内容: 在我的Java代码中,我需要向具有3个标头的特定URL发送http发布请求: 这将返回一个带有JSON“键”:“值”对的响应,然后我需要解析以某种方式将键/值(Alan / 72)存储在MAP中。响应为(使用SOAPUI或Postman Rest时): 我可以使用SOAPUI或Postman Rest来执行此操作,但是当出现错误时,如何在Java中执行此操作: 我的代码是: 我们将不胜

  • 问题内容: 我正在尝试使用来自os x终端的curl命令在我的rails应用程序上创建用户。无论我如何格式化数据,应用程序都会返回未通过我的验证的响应。 我尝试了所有变化。我尝试使用[]括号,尝试了user = {data ..},但似乎没有任何效果。有任何想法吗? 问题答案: 首先,命令末尾有一个多余的“”。 试试这个

  • 问题内容: 我需要将JSON从客户端发布到服务器。我正在使用Python 2.7.1和simplejson。客户端正在使用请求。服务器是CherryPy。我可以从服务器获取硬编码的JSON(代码未显示),但是当我尝试将JSON POST到服务器时,出现“ 400 Bad Request”。 这是我的客户代码: 这是服务器代码。 有任何想法吗? 问题答案: 从Requests 2.4.2及更高版本开