「Java 簡易Httpクライアント」の版間の差分
ナビゲーションに移動
検索に移動
(ページの作成:「==Java 簡易Httpクライアント== [Java] ===Jakarta commons HttpClient=== *http://hc.apache.org/httpclient-3.x/ ===SimpleHttpクライアント=== <blockquot…」) |
|||
(同じ利用者による、間の2版が非表示) | |||
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>上記が使えない状況があったので、HttpU[[R]]LConnectionを利用して簡易版を自作</blockquote> | |
− | import java.io. | + | import java.io.Buffered[[R]]eader; |
− | import java.io. | + | import java.io.InputStream[[R]]eader; |
import java.io.PrintWriter; | import java.io.PrintWriter; | ||
import java.io.UnsupportedEncodingException; | import java.io.UnsupportedEncodingException; | ||
− | import java.net. | + | import java.net.HttpU[[R]]LConnection; |
− | import java.net. | + | import java.net.U[[R]]L; |
− | import java.net. | + | import java.net.U[[R]]LEncoder; |
import java.util.List; | import java.util.List; | ||
import java.util.Map; | import java.util.Map; | ||
20行目: | 20行目: | ||
import org.slf4j.Logger; | import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | import org.slf4j.LoggerFactory; | ||
− | import org.springframework.stereotype. | + | import org.springframework.stereotype.Ser[[vi]]ce; |
/** | /** | ||
− | * | + | * [[Webサービス]]利用クライアント |
*/ | */ | ||
− | public class | + | public class Ser[[vi]]ceClient { |
/** | /** | ||
− | * | + | * [[Webサービス]]に、HTTP GET リクエストを送信し、結果を取得する |
* @param url | * @param url | ||
* @param headers | * @param headers | ||
* @return | * @return | ||
*/ | */ | ||
− | public static | + | public static [[R]]esponse sendGet[[R]]equest(String url, Map<String, List<String>> headers) { |
− | return | + | return send[[R]]equest(url, "GET", null, null, headers); |
} | } | ||
/** | /** | ||
− | * | + | * [[Webサービス]]に、HTTP GET リクエストを送信し、結果を取得する |
* @param url | * @param url | ||
* @param parameters | * @param parameters | ||
44行目: | 44行目: | ||
* @return | * @return | ||
*/ | */ | ||
− | public static | + | public static [[R]]esponse sendGet[[R]]equest(String url, Map<String, String> parameters, Map<String, List<String>> headers) { |
− | return | + | return send[[R]]equest(url, "GET", parameters, null, headers); |
} | } | ||
/** | /** | ||
− | * | + | * [[Webサービス]]に、HTTP POST リクエストを送信し、結果を取得する |
* @param url | * @param url | ||
* @param parameters | * @param parameters | ||
54行目: | 54行目: | ||
* @return | * @return | ||
*/ | */ | ||
− | public static | + | public static [[R]]esponse sendPost[[R]]equest(String url, Map<String, String> parameters , Map<String, List<String>> headers) { |
− | return | + | return send[[R]]equest(url, "POST", parameters, null, headers); |
} | } | ||
/** | /** | ||
− | * | + | * [[Webサービス]]に、XMLを伴ったリクエストを送信し、結果を取得する |
* @param url | * @param url | ||
* @param method | * @param method | ||
66行目: | 66行目: | ||
* @return | * @return | ||
*/ | */ | ||
− | public static | + | public static [[R]]esponse send[[R]]equestWithXml(String url, HttpMethod method, String xml, Map<String, List<String>> headers) { |
− | return | + | return send[[R]]equest(url, method, null, xml , headers); |
} | } | ||
/** | /** | ||
− | * | + | * [[Webサービス]]にリクエストを送信する |
* | * | ||
* @param url | * @param url | ||
80行目: | 80行目: | ||
* @return | * @return | ||
*/ | */ | ||
− | protected static | + | protected static [[R]]esponse send[[R]]equest( |
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) { | ||
91行目: | 91行目: | ||
} | } | ||
− | boolean | + | boolean isGet[[R]]equst = ("GET".equalsIgnoreCase(method)); |
− | boolean | + | boolean isXml[[R]]equest = StringUtils.isNotBlank(xml); |
− | boolean hasWriteTarget = ( | + | boolean hasWriteTarget = (isXml[[R]]equest || (!isGet[[R]]equst && (parameters!=null && parameters.size() > 0))); |
String writeTarget = null; | String writeTarget = null; | ||
try { | try { | ||
− | + | U[[R]]L _url = null; | |
// パラメータ文字列を生成する | // パラメータ文字列を生成する | ||
104行目: | 104行目: | ||
// 出力対象 | // 出力対象 | ||
if (hasWriteTarget) { | if (hasWriteTarget) { | ||
− | if ( | + | if (isXml[[R]]equest) { |
writeTarget = xml; | writeTarget = xml; | ||
} else { | } else { | ||
111行目: | 111行目: | ||
} | } | ||
− | // GET | + | // GET の場合、クエリにパラメータ結合しU[[R]]Lを生成 |
− | if ( | + | if (isGet[[R]]equst && StringUtils.isNotBlank(parmString)) { |
boolean hasQuery = (url.lastIndexOf('?') != -1); | boolean hasQuery = (url.lastIndexOf('?') != -1); | ||
String sep = (hasQuery)?"&":"?"; | String sep = (hasQuery)?"&":"?"; | ||
url = url + sep + parmString; | url = url + sep + parmString; | ||
} | } | ||
− | _url = new | + | _url = new U[[R]]L(url); |
− | + | HttpU[[R]]LConnection conn = (HttpU[[R]]LConnection) _url.openConnection(); | |
− | conn. | + | conn.set[[R]]equestMethod(method.toString()); |
// リダイレクトを無効にする | // リダイレクトを無効にする | ||
− | conn. | + | conn.setInstanceFollow[[R]]edirects(false); |
if (writeTarget != null) { | if (writeTarget != null) { | ||
// コネクションへの書き込みを有効化 | // コネクションへの書き込みを有効化 | ||
conn.setDoOutput(true); | conn.setDoOutput(true); | ||
String size = String.valueOf(writeTarget.getBytes("UTF-8").length); | String size = String.valueOf(writeTarget.getBytes("UTF-8").length); | ||
− | conn. | + | conn.set[[R]]equestProperty("Content-Length", size); |
} | } | ||
if (headers == null) { | if (headers == null) { | ||
// ヘッダが渡されない場合、デフォルトの値を設定 | // ヘッダが渡されない場合、デフォルトの値を設定 | ||
− | conn. | + | conn.set[[R]]equestProperty("Accept-Language","ja;q=0.7,en;q=0.3"); |
− | conn. | + | conn.set[[R]]equestProperty("If-Modified-Since","Thu, 01 Jun 1970 00:00:00 GMT"); |
− | conn. | + | conn.set[[R]]equestProperty("Connection","Keep-Alive"); |
− | conn. | + | conn.set[[R]]equestProperty("Cache-Control","no-cache"); |
− | if ( | + | if (isXml[[R]]equest) { |
− | conn. | + | conn.set[[R]]equestProperty("Content-Type","application/xml;charset=UTF-8"); |
} else if | } else if | ||
("POST".equalsIgnoreCase(method)) { | ("POST".equalsIgnoreCase(method)) { | ||
− | conn. | + | conn.set[[R]]equestProperty("Content-Type", "application/x-www-form-urlencoded"); |
} | } | ||
} else { | } else { | ||
147行目: | 147行目: | ||
for (String key: headers.keySet()) { | for (String key: headers.keySet()) { | ||
String value = StringUtils.join(headers.get(key),","); | String value = StringUtils.join(headers.get(key),","); | ||
− | conn. | + | conn.set[[R]]equestProperty(key, value); |
} | } | ||
} | } | ||
155行目: | 155行目: | ||
// 結果の生成 | // 結果の生成 | ||
− | + | [[R]]esponse response = new [[R]]esponse(); | |
// レスポンスヘッダーを設定 | // レスポンスヘッダーを設定 | ||
− | response. | + | response.setResponse[[Header]]s(conn.get[[Header]]Fields()); |
169行目: | 169行目: | ||
// 結果を受ける | // 結果を受ける | ||
− | + | Buffered[[R]]eader reader | |
− | = new | + | = new Buffered[[R]]eader(new InputStream[[R]]eader(conn.getInputStream(), "UTF-8")); |
StringBuilder buf = new StringBuilder(); | StringBuilder buf = new StringBuilder(); | ||
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(); | ||
203行目: | 203行目: | ||
for (String key : parameters.keySet()){ | for (String key : parameters.keySet()){ | ||
buf.append(((isFirst)?"":amp)); | buf.append(((isFirst)?"":amp)); | ||
− | buf.append(key + "=" + | + | buf.append(key + "=" + U[[R]]LEncoder.encode(parameters.get(key), "utf-8") ); |
isFirst = false; | isFirst = false; | ||
} | } | ||
211行目: | 211行目: | ||
} | } | ||
/** | /** | ||
− | * | + | * [[Webサービス]]クライアントのレスポンス |
*/ | */ | ||
− | public static class | + | public static class [[R]]esponse { |
− | private Map | + | private Map<String,List<String>> response[[Header]]s; |
private String body; | private String body; | ||
− | public Map | + | public Map<String, List<String>> getResponse[[Header]]s() { |
− | return | + | return response[[Header]]s; |
} | } | ||
− | public void | + | public void setResponse[[Header]]s(Map<String, List<String>> response[[Header]]s) { |
− | this. | + | this.response[[Header]]s = response[[Header]]s; |
} | } | ||
public String getBody() { | public String getBody() { | ||
229行目: | 229行目: | ||
} | } | ||
/** | /** | ||
− | * | + | * [[HTTP]]レスポンスの結果ステータスコードを取得 |
* @return | * @return | ||
*/ | */ | ||
public int getStatusCode() { | public int getStatusCode() { | ||
try { | try { | ||
− | List | + | List<String> statusLines = response[[Header]]s.get(null); |
String statusLine = statusLines.get(0); | String statusLine = statusLines.get(0); | ||
String[] strStatus = statusLine.split(" "); | String[] strStatus = statusLine.split(" "); |
2020年2月16日 (日) 04:27時点における最新版
Java 簡易Httpクライアント
Java |
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 矢木浩人