Java 如何使用谷歌&x27;s freebase与POST方法?
我在java代码中使用Google的freebase API时遇到问题。 看起来,我的查询太大,无法用GET方法发送,但我找不到将其作为POST发送的方法 这就是我得到的错误:Java 如何使用谷歌&x27;s freebase与POST方法?,java,post,http-post,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=ut
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();
}
}
}
有办法做到这一点吗?似乎没有办法覆盖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头,以便在服务器端将该请求作为GET请求处理
我已经申请了客户端库来自动处理这个问题
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();