简体   繁体   中英

How to use Google's freebase with POST method?

I'm having trouble using Google's freebase API in my java code. As it appears, my query is too large to send it in a GET method but I couldn't find a way to send it as a POST.

This is the error I'm getting:

    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)

Here's the code:

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

I have also tried to change this part in Freebase class (line 450) by switching the HttpMethod.GET part into HttpMethod.POST , but I'm sure that it's not correct way:

/**
     * 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.");
    }

Is there a way of doing this?

There doesn't appear to be a way to override the HTTP method of an API call from within the Google API client library. You'll have to build the request object yourself like this:

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

Note that I've set the X-HTTP-Method-Override header so that this request gets handled as a GET request on the server side.

I've filed a bug for the client library to handle this automatically.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM