java - 如何通过 POST 方法使用 Google 的 freebase?

标签 java post http-post freebase

我在我的 java 代码中使用 Google 的 freebase API 时遇到问题。 看起来,我的查询太大,无法以 GET 方法发送,但我找不到将其作为 POST 发送的方法。

这是我遇到的错误:

    com.google.api.client.googleapis.json.GoogleJsonResponseException: 414 Request-URI Too Large
<!DOCTYPE html>
<html lang=en>
  <meta charset=utf-8>
  <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
  <title>Error 414 (Request-URI Too Large)!!1</title>
  <style>
    *{margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px}* > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}
  </style>
  <a href=//www.google.com/><img src=//www.google.com/images/errors/logo_sm.gif alt=Google></a>
  <p><b>414.</b> <ins>That’s an error.</ins>
  <p>The requested URL <code>/freebase/v1/mqlread</code>... is too large to process.  <ins>That’s all we know.</ins>

    at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:143)
    at com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:187)
    at com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:279)
    at com.google.api.client.http.json.JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:207)
    at com.huawei.mdf.MQLReadService.doMqlRead(MQLReadService.java:67)
    at com.huawei.mdf.MQLReadService.main(MQLReadService.java:82)

代码如下:

public void doMqlRead(String id, QueryType queryType) {

    HttpTransport httpTransport = new NetHttpTransport();
    JsonFactory jsonFactory = new JacksonFactory();
    HttpRequestInitializer httpRequestInitializer = new HttpRequestInitializer() {
        @Override
        public void initialize(HttpRequest arg0) throws IOException {
            // TODO Auto-generated method stub

        }
    };

    JsonHttpRequestInitializer requestInitializer = new JsonHttpRequestInitializer() {
        public void initialize(JsonHttpRequest jsonHttpRequest)
                throws IOException {
            FreebaseRequest freebaseRequest = (FreebaseRequest) jsonHttpRequest;
            freebaseRequest.setPrettyPrint(true);
            freebaseRequest.setKey(API_KEY);
        }
    };

    Freebase.Builder fbb = new Freebase.Builder(httpTransport, jsonFactory,
            httpRequestInitializer);

    Freebase freebase = fbb.setJsonHttpRequestInitializer(
            requestInitializer).build();

    List<String> queryList = QueryUtil.getQuery(queryType);
    for (String query : queryList) {
        query = query.replace("idreplace", id);
        System.out.println(query.length());

        try {
            Mqlread mqlread = freebase.mqlread(query);
            mqlread.setIndent(indentation);

            HttpResponse executeUnparsed = mqlread.executeUnparsed();
            String parseAsString = executeUnparsed.parseAsString();
            System.out.println(parseAsString);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

我还尝试通过将 HttpMethod.GET 部分切换为 HttpMethod.POST 来更改 Freebase 类(第 450 行)中的这一部分,但我确信这不是正确的方法:

/**
     * Internal constructor. Use the convenience method instead.
     */
    Mqlread(String query) {
        super(Freebase.this, HttpMethod.GET, REST_PATH, null);
        this.query = Preconditions.checkNotNull(query,
                "Required parameter query must be specified.");
    }

有没有办法做到这一点?

最佳答案

似乎没有办法从 Google API 客户端库中覆盖 API 调用的 HTTP 方法。您必须像这样自己构建请求对象:

HttpTransport httpTransport = new NetHttpTransport();
HttpRequestFactory httpRequestFactory = httpTransport.createRequestFactory();

String data = "query=" + query;
HttpContent content = new ByteArrayContent("application/x-www-form-urlencoded", data.getBytes());
GenericUrl url = new GenericUrl("https://www.googleapis.com/freebase/v1/mqlread");

HttpRequest request = httpRequestFactory.buildPostRequest(url, content);
HttpHeaders headers = new HttpHeaders();
headers.put("X-HTTP-Method-Override","GET");
request.setHeaders(headers);

HttpResponse response = request.execute();

请注意,我已经设置了 X-HTTP-Method-Override header ,以便在服务器端将此请求作为 GET 请求进行处理。

我已经提交了 a bug让客户端库自动处理。

关于java - 如何通过 POST 方法使用 Google 的 freebase?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13232704/

相关文章:

javascript - Jquery/Javascript 中的 Post/Get 处理程序

python - Django 表单不显示

lua - 使用lua模拟登录

rest - 使用 WifiESP 库对带有 ESP8266 的 arduino 进行 POST 请求

java - 当服务器不是多线程服务器时,为什么要同时处理多个客户端?

java - 用于java开发的Smalltalk列式类浏览器

java - 使用 spring 和 bean 列表创建表单

将数据库从 MySQL 更改为 SQLite 后的 Java 项目错误

http - 用于排查和查看原始 HTTP 请求的工具

VB.net 使用 POST 方法的 HttpWebRequest 替代方式