Live Search with Java

MicrosoftLive Search API を調べています。基本的には SOAP によるインタフェースで、WSDL ファイルが提供されているので楽勝だと思っていたのですが、しばらく SOAP を使っていなかったため、意外なところで苦労しました。

JavaSOAP を使う場合、幾つかの選択肢がありますが、Java 6 で取り込まれた JAX-WS を使うか、Apache Axis を使うか、というのが簡単です。

JAX-WS を使う場合は、次のようになります。


$ mkdir src
$ wsimport -d src http://soap.search.msn.com/webservices.asmx?wsdl

これでクライアントコードが生成できれば良かったのですが、実際には WSDL の Parse エラーとなり終了。

Axis および Axis2 では、WSDL2Java (WSDL2Code) にてクライアントコードの生成はできましたが、Axis2 の lib ディレクトリの jar ファイルが 60 個もあり、ランタイムに必要なものを絞り込むのも大変でしたので、最終的には Axis を使うことにしました。60 個というのは、さすがにリソースも食うしバージョン関係も難しい。

Live Interactive SDK にある "Get total results" は、次のようになります。Java にも C# のような Property がはやく欲しいところです。


import com.microsoft.schemas.MSNSearch._2005._09.fex.*;

public class LiveSearch {

private static final String APPID;

public LiveSearch(String appId) {
this.APPID = appId;
}

public int getTotalResultsAvailable(String query) {

try {
MSNSearchPortType svc = new MSNSearchServiceLocator()
.getMSNSearchPort();

SearchRequest searchRequest = new SearchRequest();

SourceRequest[] sr = new SourceRequest[1];
sr[0] = new SourceRequest();
sr[0].setSource(SourceType.Web);
String[] masks = { "Title" };
sr[0].setResultFields(masks);

searchRequest.setQuery(query);
searchRequest.setRequests(sr);

searchRequest.setAppID(APPID);
searchRequest.setCultureInfo("ja-jp");
String[] flags = { "DisableHostCollapsing" };
searchRequest.setFlags(flags);

searchRequest.setSafeSearch(SafeSearchOptions.Off);

SearchResponse searchResponse = svc.search(searchRequest);

if (searchResponse != null) {
SourceResponse[] responses = searchResponse.getResponses();
return responses[0].getTotal();
} else {
return 0;
}
} catch (Exception e) {
e.printStackTrace();
}

return 0;
}

}