java

 

Apache Http Client4を扱う

Apache Http Client4を使ったサンプルコードです。APIをリクエストする際等でHttp Clientを使う際に、汎用親クラスがあると便利です。

新サイト、tree-mapsを公開しました!!

tree-maps: 地図のWEB TOOLの事ならtree-mapsにお任せ!

地図に関するWEB TOOL専門サイトです!!

大画面で大量の緯度経度を一気にプロット、ジオコーディング、DMS<->DEGの相互変換等ができます!

◯ 広告

HttpClient4は情報が少なく、EntityUtils等、知っていないと冗長なコードになり易いです。

以下のサンプルはgoogle guavaを使っているので注意して下さい。

import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.util.EntityUtils;

import com.google.common.base.Charsets;
import com.google.common.base.Strings;

/**
 * API実行の基底クラスです。
 * @author tree
 *
 */
abstract class BaseApi {

    private Integer connectionTimeout;

    private Integer socketTimeout;

    private HttpClient httpclient;

    /**
     * リクエストします。
     * @param uri uri
     * @param urlParam param
     * @param method HttpGet、HttpPost等
     */
    public ApiResponse request(String uri, List < NameValuePair > urlParam, HttpRequestBase method) {
        if (Strings.isNullOrEmpty(uri) || urlParam == null || method == null)
            throw new RuntimeException("パラメータが不正です。");
        // httpクライアントを生成
        if (connectionTimeout != null || socketTimeout != null) {
            HttpParams httpParams = new BasicHttpParams();
            if (connectionTimeout != null)
                HttpConnectionParams.setConnectionTimeout(httpParams, connectionTimeout);
            if (socketTimeout != null)
                HttpConnectionParams.setSoTimeout(httpParams, socketTimeout);
            httpclient = new DefaultHttpClient(httpParams);
        } else {
            httpclient = new DefaultHttpClient();
        }
        // URLを生成
        String queryString = URLEncodedUtils.format(urlParam, Charsets.UTF_8);
        String url = new StringBuilder(uri).append("?").append(queryString).toString();
        HttpRequestBase httpMethod = null;
        if (method instanceof HttpPost) {
            httpMethod = new HttpPost(url);
        } else {
            httpMethod = new HttpGet(url);
        }
        ApiResponse apiResponse = new ApiResponse();
        try {
            // リクエストする
            HttpResponse response = httpclient.execute(httpMethod);
            apiResponse.setHeaders(response.getAllHeaders());
            apiResponse.setStatusCd(Integer.valueOf(response.getStatusLine().getStatusCode()));
            HttpEntity entity = response.getEntity();
            if (entity == null) {
                return apiResponse;
            }
            apiResponse.setContent(EntityUtils.toString(entity, Charsets.UTF_8));
            EntityUtils.consume(entity);
        } catch (Exception e) {
            Integer statusCd = apiResponse.getStatusCd();
            log.error(statusCd, e);
        } finally {
            httpMethod.abort();
            httpclient.getConnectionManager().shutdown();
        }
        return apiResponse;
    }

    public void setConnectionTimeout(Integer connectionTimeout) {
        this.connectionTimeout = connectionTimeout;
    }

    public void setSocketTimeout(Integer socketTimeout) {
        this.socketTimeout = socketTimeout;
    }
}
import java.io.Serializable;

import org.apache.http.Header;

public class ApiResponse implements Serializable {

    private static final long serialVersionUID = 1L;

    private String url;

    private Header[] headers;

    private Integer statusCd;

    private String content;

    public String getHeader(String name) {
        for (Header header : headers) {
            if (name.equals(header.getName()))
                return header.getValue();
        }
        return null;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public Header[] getHeaders() {
        return headers;
    }

    public void setHeaders(Header[] headers) {
        this.headers = headers;
    }

    public Integer getStatusCd() {
        return statusCd;
    }

    public void setStatusCd(Integer statusCd) {
        this.statusCd = statusCd;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

以下は、http clientを使って「Yahoo!ジオコーダAPI」にリクエストするサンプルです。

google guavaJSONICを使っているので注意して下さい。

import java.util.List;

import net.arnx.jsonic.JSON;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.NameValuePair;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.message.BasicNameValuePair;

import com.google.common.collect.Lists;

/**
 * Yahoo!ジオコーダAPI
 * @see http://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/geocoder.html
 * @author tree
 * 
 */
public class YahooGeocodeApi extends BaseApi {

    private static Log log = LogFactory.getLog(YahooGeocodeApi.class);

    public static void mail(String[] args) {
        YahooGeocodeApi yahooGeocodeApi = new YahooGeocodeApi();
        YahooGeocodeDto dto = yahooGeocodeApi.execute(YahooGeocodeDto.class, "");
    }

    public < T > T execute(Class < T > t, String address) {
        List < NameValuePair > params = Lists.newArrayList();
        params.add(new BasicNameValuePair("appid", "APIキーを設定します"));
        params.add(new BasicNameValuePair("output", "json"));
        params.add(new BasicNameValuePair("query", address));
        params.add(new BasicNameValuePair("al", "4"));
        params.add(new BasicNameValuePair("ar", "ge"));
        params.add(new BasicNameValuePair("recursive", "true"));
        String uri = "http://geo.search.olp.yahooapis.jp/OpenLocalPlatform/V1/geoCoder";
        ApiResponse response = request(uri, params, new HttpGet());
        return JSON.decode(response.getContent(), t);
    }
}
◯ 広告