Live Search with Java
Microsoft の Live Search API を調べています。基本的には SOAP によるインタフェースで、WSDL ファイルが提供されているので楽勝だと思っていたのですが、しばらく SOAP を使っていなかったため、意外なところで苦労しました。
Java で SOAP を使う場合、幾つかの選択肢がありますが、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;
}}