「Java 簡易Httpクライアント」の版間の差分
ナビゲーションに移動
検索に移動
(ページの作成:「==Java 簡易Httpクライアント== [Java] ===Jakarta commons HttpClient=== *http://hc.apache.org/httpclient-3.x/ ===SimpleHttpクライアント=== <blockquot…」) |
|||
1行目: | 1行目: | ||
==Java 簡易Httpクライアント== | ==Java 簡易Httpクライアント== | ||
− | [Java] | + | [[Java]] |
===Jakarta commons HttpClient=== | ===Jakarta commons HttpClient=== | ||
*http://hc.apache.org/httpclient-3.x/ | *http://hc.apache.org/httpclient-3.x/ | ||
6行目: | 6行目: | ||
===SimpleHttpクライアント=== | ===SimpleHttpクライアント=== | ||
− | + | <blockquote>上記が使えない状況があったので、HttpURLConnectionを利用して簡易版を自作</blockquote> | |
import java.io.BufferedReader; | import java.io.BufferedReader; | ||
import java.io.InputStreamReader; | import java.io.InputStreamReader; | ||
33行目: | 33行目: | ||
* @return | * @return | ||
*/ | */ | ||
− | public static Response sendGetRequest(String url, Map | + | public static Response sendGetRequest(String url, Map<String, List<String>> headers) { |
return sendRequest(url, "GET", null, null, headers); | return sendRequest(url, "GET", null, null, headers); | ||
} | } | ||
44行目: | 44行目: | ||
* @return | * @return | ||
*/ | */ | ||
− | public static Response sendGetRequest(String url, Map | + | public static Response sendGetRequest(String url, Map<String, String> parameters, Map<String, List<String>> headers) { |
return sendRequest(url, "GET", parameters, null, headers); | return sendRequest(url, "GET", parameters, null, headers); | ||
} | } | ||
54行目: | 54行目: | ||
* @return | * @return | ||
*/ | */ | ||
− | public static Response sendPostRequest(String url, Map | + | public static Response sendPostRequest(String url, Map<String, String> parameters , Map<String, List<String>> headers) { |
return sendRequest(url, "POST", parameters, null, headers); | return sendRequest(url, "POST", parameters, null, headers); | ||
} | } | ||
66行目: | 66行目: | ||
* @return | * @return | ||
*/ | */ | ||
− | public static Response sendRequestWithXml(String url, HttpMethod method, String xml, Map | + | public static Response sendRequestWithXml(String url, HttpMethod method, String xml, Map<String, List<String>> headers) { |
return sendRequest(url, method, null, xml , headers); | return sendRequest(url, method, null, xml , headers); | ||
} | } | ||
83行目: | 83行目: | ||
String url, | String url, | ||
String method, | String method, | ||
− | Map | + | Map<String, String> parameters, |
String xml, | String xml, | ||
− | Map | + | Map<String, List<String>> headers) { |
if (url == null) { | if (url == null) { | ||
93行目: | 93行目: | ||
boolean isGetRequst = ("GET".equalsIgnoreCase(method)); | boolean isGetRequst = ("GET".equalsIgnoreCase(method)); | ||
boolean isXmlRequest = StringUtils.isNotBlank(xml); | boolean isXmlRequest = StringUtils.isNotBlank(xml); | ||
− | boolean hasWriteTarget = (isXmlRequest || (!isGetRequst && (parameters!=null && parameters.size() | + | boolean hasWriteTarget = (isXmlRequest || (!isGetRequst && (parameters!=null && parameters.size() > 0))); |
String writeTarget = null; | String writeTarget = null; | ||
195行目: | 195行目: | ||
* @throws UnsupportedEncodingException | * @throws UnsupportedEncodingException | ||
*/ | */ | ||
− | public static String makeParmString(Map | + | public static String makeParmString(Map<String, String> parameters) throws UnsupportedEncodingException { |
− | if (parameters != null && parameters.size() | + | if (parameters != null && parameters.size() > 0) { |
StringBuilder buf = new StringBuilder(); | StringBuilder buf = new StringBuilder(); | ||
214行目: | 214行目: | ||
*/ | */ | ||
public static class Response { | public static class Response { | ||
− | private Map | + | private Map<String,List<String>> responseHeaders; |
private String body; | private String body; | ||
− | public Map | + | public Map<String, List<String>> getResponseHeaders() { |
return responseHeaders; | return responseHeaders; | ||
} | } | ||
− | public void setResponseHeaders(Map | + | public void setResponseHeaders(Map<String, List<String>> responseHeaders) { |
this.responseHeaders = responseHeaders; | this.responseHeaders = responseHeaders; | ||
} | } | ||
234行目: | 234行目: | ||
public int getStatusCode() { | public int getStatusCode() { | ||
try { | try { | ||
− | List | + | List<String> statusLines = responseHeaders.get(null); |
String statusLine = statusLines.get(0); | String statusLine = statusLines.get(0); | ||
String[] strStatus = statusLine.split(" "); | String[] strStatus = statusLine.split(" "); |
2020年2月15日 (土) 08:03時点における版
Java 簡易Httpクライアント
Jakarta commons HttpClient
SimpleHttpクライアント
<blockquote>上記が使えない状況があったので、HttpURLConnectionを利用して簡易版を自作</blockquote>
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; /** * Webサービス利用クライアント */ public class ServiceClient { /** * Webサービスに、HTTP GET リクエストを送信し、結果を取得する * @param url * @param headers * @return */ public static Response sendGetRequest(String url, Map<String, List<String>> headers) { return sendRequest(url, "GET", null, null, headers); } /** * Webサービスに、HTTP GET リクエストを送信し、結果を取得する * @param url * @param parameters * @param headers * @return */ public static Response sendGetRequest(String url, Map<String, String> parameters, Map<String, List<String>> headers) { return sendRequest(url, "GET", parameters, null, headers); } /** * Webサービスに、HTTP POST リクエストを送信し、結果を取得する * @param url * @param parameters * @param headers * @return */ public static Response sendPostRequest(String url, Map<String, String> parameters , Map<String, List<String>> headers) { return sendRequest(url, "POST", parameters, null, headers); } /** * Webサービスに、XMLを伴ったリクエストを送信し、結果を取得する * @param url * @param method * @param xml * @param headers * @return */ public static Response sendRequestWithXml(String url, HttpMethod method, String xml, Map<String, List<String>> headers) { return sendRequest(url, method, null, xml , headers); } /** * Webサービスにリクエストを送信する * * @param url * @param method * @param parameters * @param xml * @param headers * @return */ protected static Response sendRequest( String url, String method, Map<String, String> parameters, String xml, Map<String, List<String>> headers) { if (url == null) { throw new IllegalArgumentException(); } boolean isGetRequst = ("GET".equalsIgnoreCase(method)); boolean isXmlRequest = StringUtils.isNotBlank(xml); boolean hasWriteTarget = (isXmlRequest || (!isGetRequst && (parameters!=null && parameters.size() > 0))); String writeTarget = null; try { URL _url = null; // パラメータ文字列を生成する String parmString = makeParmString(parameters); // 出力対象 if (hasWriteTarget) { if (isXmlRequest) { writeTarget = xml; } else { writeTarget = parmString; } } // GET の場合、クエリにパラメータ結合しURLを生成 if (isGetRequst && StringUtils.isNotBlank(parmString)) { boolean hasQuery = (url.lastIndexOf('?') != -1); String sep = (hasQuery)?"&":"?"; url = url + sep + parmString; } _url = new URL(url); HttpURLConnection conn = (HttpURLConnection) _url.openConnection(); conn.setRequestMethod(method.toString()); // リダイレクトを無効にする conn.setInstanceFollowRedirects(false); if (writeTarget != null) { // コネクションへの書き込みを有効化 conn.setDoOutput(true); String size = String.valueOf(writeTarget.getBytes("UTF-8").length); conn.setRequestProperty("Content-Length", size); } if (headers == null) { // ヘッダが渡されない場合、デフォルトの値を設定 conn.setRequestProperty("Accept-Language","ja;q=0.7,en;q=0.3"); conn.setRequestProperty("If-Modified-Since","Thu, 01 Jun 1970 00:00:00 GMT"); conn.setRequestProperty("Connection","Keep-Alive"); conn.setRequestProperty("Cache-Control","no-cache"); if (isXmlRequest) { conn.setRequestProperty("Content-Type","application/xml;charset=UTF-8"); } else if ("POST".equalsIgnoreCase(method)) { conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); } } else { // ヘッダが渡された場合、値を転記 for (String key: headers.keySet()) { String value = StringUtils.join(headers.get(key),","); conn.setRequestProperty(key, value); } } // コネクションを開く conn.connect(); // 結果の生成 Response response = new Response(); // レスポンスヘッダーを設定 response.setResponseHeaders(conn.getHeaderFields()); // 出力の書き込み if (writeTarget != null) { PrintWriter printWriter = new PrintWriter(conn.getOutputStream()); printWriter.print(writeTarget); printWriter.close(); } // 結果を受ける BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); StringBuilder buf = new StringBuilder(); String line = null; while((line = reader.readLine())!=null) { buf.append(line); } reader.close(); response.setBody(buf.toString()); return response; } catch (Exception e) { e.printStackTrace(); throw new IllegalStateException(e); } } /** * パラメータ文字列を生成する * @param parameters * @return * @throws UnsupportedEncodingException */ public static String makeParmString(Map<String, String> parameters) throws UnsupportedEncodingException { if (parameters != null && parameters.size() > 0) { StringBuilder buf = new StringBuilder(); String amp = "&"; boolean isFirst = true; for (String key : parameters.keySet()){ buf.append(((isFirst)?"":amp)); buf.append(key + "=" + URLEncoder.encode(parameters.get(key), "utf-8") ); isFirst = false; } return buf.toString(); } return ""; } /** * Webサービスクライアントのレスポンス */ public static class Response { private Map<String,List<String>> responseHeaders; private String body; public Map<String, List<String>> getResponseHeaders() { return responseHeaders; } public void setResponseHeaders(Map<String, List<String>> responseHeaders) { this.responseHeaders = responseHeaders; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } /** * HTTPレスポンスの結果ステータスコードを取得 * @return */ public int getStatusCode() { try { List<String> statusLines = responseHeaders.get(null); String statusLine = statusLines.get(0); String[] strStatus = statusLine.split(" "); int status = Integer.parseInt(strStatus[1]); return status; } catch (Exception e) { throw new IllegalStateException(e); } } } }
© 2006 矢木浩人