Azure Bing Search API (URL リンクのみ) を試していますが、API を返すのに 1.5 ~ 2.5 秒かからないように、誰かが私の Java を改良するのを手伝ってくれるかどうか疑問に思っていました。
ボトルネックを見つけたと思いますが、それを修正する方法がわかりません。
具体的には、検索用語と accountKey を提供した後、URLConnection をセットアップしました。この時点まで、アプリケーションはすばやく実行されますが、何も返されません。そのために、InputStream を作成し、while ループを実行してすべての文字を StringBuilder に追加します。速度を著しく低下させる部分です。
私がやっていることよりも速く検索結果を取得する方法はありますか? json や Bing のオプションを使用して tarball で結果を取得しようとしたことはありませんが、これらがこれを大幅に変更するかどうかはわかりません。
詳細 – OS (基本的な CentOS ボックスと Windows 7 ボックスで試しました。どちらも Eclipse のコンソールを使用して結果を確認しました)。Myspeedtest.net は、下り 12Mbps、上り 1Mbps を示しています。
public static void api(String st) throws IOException{
String bingUrl = "https://api.datamarket.azure.com/Bing/Search/Web?Query=%27"+st+"%27";
String accountKey = "ASDFASDFASDFASDFASDFASDF=";
byte[] accountKeyBytes = Base64.encodeBase64((accountKey + ":" + accountKey).getBytes());
String accountKeyEnc = new String(accountKeyBytes);
URL url = new URL(bingUrl);
URLConnection urlConnection = url.openConnection();
urlConnection.setRequestProperty("Authorization", "Basic " + accountKeyEnc);
//FROM HERE DOWN IS WHAT SEEMS TO TAKE FOREVER.
InputStream is = urlConnection.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
int numCharsRead;
char[] charArray = new char[1024];
StringBuilder sb = new StringBuilder();
while ((numCharsRead = isr.read(charArray)) > 0) {
sb.append(charArray, 0, numCharsRead);
}
System.out.println(sb.toString());
}
編集 #### 編集 ### 編集 ##### 編集
json と Apache httpclient を使用してこれを行う別の方法を試しました。繰り返しますが、これもうまく機能しますが、遅いです。多分それはMsftのサービスですか?
package com.search;
import org.apache.commons.codec.binary.Base64;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
public class BingAPI2 {
public static void getBing() throws Exception {
HttpClient httpclient = new DefaultHttpClient();
try {
String accountKey = "ASDFASDFASDFASDFASDFASDFASDF=";
byte[] accountKeyBytes = Base64.encodeBase64((accountKey + ":" + accountKey).getBytes());
String accountKeyEnc = new String(accountKeyBytes);
HttpGet httpget = new HttpGet("https://api.datamarket.azure.com/Data.ashx/Bing/Search/Web?Query=%27Datamarket%27&$top=10&$format=Json");
httpget.setHeader("Authorization", "Basic <"+accountKeyEnc+">");
System.out.println("executing request " + httpget.getURI());
// Create a response handler
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = httpclient.execute(httpget, responseHandler);
System.out.println("----------------------------------------");
System.out.println(responseBody);
System.out.println("----------------------------------------");
} finally {
// When HttpClient instance is no longer needed,
// shut down the connection manager to ensure
// immediate deallocation of all system resources
httpclient.getConnectionManager().shutdown();
}
}
}