java HttpClientの実装

サーバー部品

web.xml

CharacterEncodingShiftJISFilterで特定のurlをShift-JISで処理する

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">

    <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
        </listener-class>
    </listener>
    <context-param>
        <param-name>contextClass</param-name>
        <param-value>
            org.springframework.web.context.support.AnnotationConfigWebApplicationContext
        </param-value>
    </context-param>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>example.config.AppConfig</param-value>
    </context-param>

    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>
            org.springframework.web.filter.CharacterEncodingFilter
        </filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>CharacterEncodingShiftJISFilter</filter-name>
        <filter-class>
            org.springframework.web.filter.CharacterEncodingFilter
        </filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>Shift-JIS</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingShiftJISFilter</filter-name>
        <url-pattern>/echo_shiftjis</url-pattern>
    </filter-mapping>

    <servlet>
        <servlet-name>app</servlet-name>
        <servlet-class>
            <!-- DispatcherServletクラスをサーブレットコンテナに登録します. -->
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <init-param>
            <!-- contextClassパラメータにAnnotationConfigWebApplicationContextを指定します. -->
            <param-name>contextClass</param-name>
            <param-value>
                org.springframework.web.context.support.AnnotationConfigWebApplicationContext
            </param-value>
        </init-param>
        <init-param>
            <!-- contextConfigLocationパラメータに作成したコンフィギュレーションクラスを指定します. -->
            <param-name>contextConfigLocation</param-name>
            <param-value>example.config.WebMvcConfig</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <!-- DispatcherServlet を使用してリクエストをハンドリングするURLのパターンを定義します. -->
        <servlet-name>app</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <jsp-config>
        <jsp-property-group>
            <url-pattern>*.jsp</url-pattern>
            <page-encoding>UTF-8</page-encoding>
            <include-prelude>/WEB-INF/include.jsp</include-prelude>
        </jsp-property-group>
    </jsp-config>

</web-app>

■index.jsp

<html>
<body>
    <ul>
        <li><a href="<c:url value='/echo' />">エコーアプリケーションへ</a></li>
        <li><a href="<c:url value='/echo_shiftjis' />">エコー(Shift-JIS)アプリケーション</a></li>
    </ul>
</body>
</html>

■input.jsp(UTF-8用)

<html>
<body>
    <h2>入力画面</h2>
    <form:form modelAttribute="echoForm">
        <div>テキストを入力してください :</div>
        <div>
            <form:input path="text" />
            <form:errors path="text" />
        </div>
        <div>
            <form:button>送信</form:button>
        </div>
    </form:form>
</body>
</html>

■input_shiftjis.jsp(Shift-JIS用)

リクエスト元とリクエスト先の文字コードが異なる場合の対応

UTF-8のページでShift-JISのページにpostするので「accept-charset=”shift_jis”」を追加

<html>
<body>
    <h2>入力画面(accept-charset="shift_jis")</h2>
    <form:form modelAttribute="echoForm" accept-charset="shift_jis">
        <div>テキストを入力してください :</div>
        <div>
            <form:input path="text" />
            <form:errors path="text" />
        </div>
        <div>
            <form:button>送信</form:button>
        </div>
    </form:form>
</body>
</html>

EchoController.java(UTF-8用)

package example.app;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("echo")
public class EchoController {
    @RequestMapping(method = RequestMethod.GET)
    public String viewInput(Model model) {
        EchoForm form = new EchoForm();
        model.addAttribute(form);
        return "echo/input";
    }
    @RequestMapping(method = RequestMethod.POST)
    public String echo(@Valid EchoForm form, BindingResult result) {
        if (result.hasErrors()) {
            return "echo/input";
        }
        return "echo/output";
    }
}

EchoShiftJisController.java(Shift-JIS用)

package example.app;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("echo_shiftjis")
public class EchoShiftJisController {
    @RequestMapping(method = RequestMethod.GET)
    public String viewInput(Model model) {
        EchoForm form = new EchoForm();
        model.addAttribute(form);
        return "echo/input_shiftjis";
    }
    @RequestMapping(method = RequestMethod.POST)
    public String echo(@Valid EchoForm form, BindingResult result) {
        if (result.hasErrors()) {
            return "echo/input";
        }
        return "echo/output_shiftjis";
    }
}

■Client部品

HttpURLConnectionMain.java

package http.client;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
public class HttpURLConnectionMain {
	public static void main(String[] args) throws Exception {
		String urlstrUTF8 = "http://192.168.0.7:8080/CardAuthStub/echo";
		String urlstrShiftJIS = "http://192.168.0.7:8080/CardAuthStub/echo_shiftjis";
		String text = "テスト タロウ";
		String postDataUTF8 = "text=" + URLEncoder.encode(text, "UTF-8");
		String postDataShiftJIS = "text=" + URLEncoder.encode(text, "Shift-JIS");

		post(urlstrShiftJIS, postDataShiftJIS, "UTF-8");
	}

	private static void post(String urlstr, String postData, String charset) throws IOException {

		URL url = new URL(urlstr);
		try {
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setRequestMethod("POST");
			conn.setDoOutput(true);
			conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=" + charset);
			//			conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
			conn.setRequestProperty("Content-Length", Integer.toString(postData.length()));
			conn.setUseCaches(false);
			conn.setConnectTimeout(1000);
			conn.setReadTimeout(60000);

			DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
			dos.writeBytes(postData);

			BufferedReader br = new BufferedReader(new InputStreamReader(
					conn.getInputStream()));

			String line;
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

■HttpURLConnectionMain2.java

package http.client;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class HttpURLConnectionMain2 {
	public static void main(String[] args) throws Exception {
		String urlstrUTF8 = "http://192.168.0.7:8080/CardAuthStub/echo";
		String urlstrShiftJIS = "http://192.168.0.7:8080/CardAuthStub/echo_shiftjis";
		String text = "テスト タロウ";
		String postDataUTF8 = "text=" + URLEncoder.encode(text, "UTF-8");
		String postDataShiftJIS = "text=" + URLEncoder.encode(text, "Shift-JIS");

		//		post(urlstrUTF8, postDataUTF8 ,"UTF-8");
		//		post(urlstrUTF8, postDataShiftJIS ,"UTF-8");

		//		post(urlstrShiftJIS, postDataUTF8 ,"Shift-JIS");
		post(urlstrShiftJIS, postDataShiftJIS, "UTF-8");
		//		post(urlstrShiftJIS, postDataShiftJIS ,"Shift-JIS");
	}

	private static void post(String urlstr, String postData, String charset) throws IOException {

		URL url = new URL(urlstr);
		try {
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			conn.setRequestMethod("POST");
			conn.setDoOutput(true);
			conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=" + charset);
			//			conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
			conn.setRequestProperty("Content-Length", Integer.toString(postData.length()));
			conn.setUseCaches(false);
			conn.setConnectTimeout(1000);
			conn.setReadTimeout(60000);

			DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
			dos.writeBytes(postData);

			// 接続を開始する
			conn.connect();

			// サーバーから受信したメッセージのヘッダー部分を取得します。
			Map<String,List<String>> headers = conn.getHeaderFields();
			Iterator<?> headerIt = headers.keySet().iterator();
			String header = null;
			while(headerIt.hasNext()){
			    String headerKey = (String)headerIt.next();
			    header += headerKey + ":" + headers.get(headerKey) + "\r\n";
			}
			System.out.println(header);

			// サーバーから受信したメッセージの本文であるBODY部を取得します。
			BufferedReader br = new BufferedReader(new InputStreamReader(
					conn.getInputStream()));
			String line;
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

■RestTemplateMain.java

package http.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.Charset;

import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.util.CollectionUtils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

public class RestTemplateMain {

	public static void main(String[] args) {

		String charsetUTF8 = "UTF-8";
		String charsetShiftJIS = "Shift_JIS";

		String urlstrUTF8 = "http://192.168.0.8:8080/CardAuthStub/echo";
		String urlstrShiftJIS = "http://192.168.0.8:8080/CardAuthStub/echo_shiftjis";

		//		postExchange(charsetUTF8, urlstrUTF8);
		//		postExchange(charsetShiftJIS, urlstrShiftJIS);
		//
		//		postExchangeBinary(charsetUTF8, urlstrUTF8);
		postExchangeInputStream(charsetShiftJIS, urlstrShiftJIS);
	}

	private static void postExchange(String charsetShiftJIS, String urlstrShiftJIS) {
		// リクエストパラメタを送信する(文字コード指定)
		HttpHeaders paramsHeaders = new HttpHeaders();
		paramsHeaders
				.setContentType(new MediaType(MediaType.APPLICATION_FORM_URLENCODED, Charset.forName(charsetShiftJIS)));

		MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
		params.add("text", "テスト タロウ");

		RestTemplate client = new RestTemplate(new SimpleClientHttpRequestFactory());

		//ボディ変換器の文字変換にレスポンスの文字コードを設定する。
		CollectionUtils.findValueOfType(client.getMessageConverters(), StringHttpMessageConverter.class)
				.setDefaultCharset(Charset.forName(charsetShiftJIS));

		//リクエスト作成

		try {
			RequestEntity<?> req = new RequestEntity<>(params, paramsHeaders, HttpMethod.POST, new URI(urlstrShiftJIS));
			//リクエスト処理(レスポンスの型をStringにするだけ)
			ResponseEntity<String> response = client.exchange(req, String.class);
			String body = response.getBody();

			System.out.println("Headers:" + response.getHeaders());
			System.out.println("StatusCode:" + response.getStatusCode());
			System.out.println("StatusCodeValue:" + response.getStatusCodeValue());

			System.out.println(body);

		} catch (URISyntaxException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
	}

	private static void postExchangeByte(String charsetShiftJIS, String urlstrShiftJIS) {
		// リクエストパラメタを送信する(文字コード指定)
		HttpHeaders paramsHeaders = new HttpHeaders();
		paramsHeaders
				.setContentType(new MediaType(MediaType.APPLICATION_FORM_URLENCODED, Charset.forName(charsetShiftJIS)));

		MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
		params.add("text", "テスト タロウ");

		RestTemplate client = new RestTemplate(new SimpleClientHttpRequestFactory());

		//ボディ変換器の文字変換にレスポンスの文字コードを設定する。
		CollectionUtils.findValueOfType(client.getMessageConverters(), StringHttpMessageConverter.class)
				.setDefaultCharset(Charset.forName(charsetShiftJIS));

		//リクエスト作成

		try {
			RequestEntity<?> req = new RequestEntity<>(params, paramsHeaders, HttpMethod.POST, new URI(urlstrShiftJIS));
			//リクエスト処理(レスポンスの型をStringにするだけ)
			ResponseEntity<byte[]> response = client.exchange(req, byte[].class);
			byte[] body = response.getBody();

			System.out.println("Headers:" + response.getHeaders());
			System.out.println("StatusCode:" + response.getStatusCode());
			System.out.println("StatusCodeValue:" + response.getStatusCodeValue());

			System.out.println(new String(body));

		} catch (URISyntaxException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
	}

	private static void postExchangeInputStream(String charsetShiftJIS, String urlstrShiftJIS) {
		// リクエストパラメタを送信する(文字コード指定)
		HttpHeaders paramsHeaders = new HttpHeaders();
		paramsHeaders
				.setContentType(new MediaType(MediaType.APPLICATION_FORM_URLENCODED, Charset.forName(charsetShiftJIS)));

		MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
		params.add("text", "テスト タロウ");

		RestTemplate client = new RestTemplate(new SimpleClientHttpRequestFactory());

		//ボディ変換器の文字変換にレスポンスの文字コードを設定する。
		CollectionUtils.findValueOfType(client.getMessageConverters(), StringHttpMessageConverter.class)
				.setDefaultCharset(Charset.forName(charsetShiftJIS));

		//リクエスト作成

		try {
			RequestEntity<?> req = new RequestEntity<>(params, paramsHeaders, HttpMethod.POST, new URI(urlstrShiftJIS));
			//リクエスト処理(レスポンスの型をStringにするだけ)
			ResponseEntity<Resource> response = client.exchange(req, Resource.class);
			InputStream responseInputStream;
			try {
			    responseInputStream = response.getBody().getInputStream();
			}
			catch (IOException e) {
			    throw new RuntimeException(e);
			}
			System.out.println("Headers:" + response.getHeaders());
			System.out.println("StatusCode:" + response.getStatusCode());
			System.out.println("StatusCodeValue:" + response.getStatusCodeValue());

			// サーバーから受信したメッセージの本文であるBODY部を取得します。
			BufferedReader br = new BufferedReader(new InputStreamReader(responseInputStream));
			String line;
			while ((line = br.readLine()) != null) {
				System.out.println(line);
			}

		} catch (URISyntaxException | IOException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
	}
}
スポンサーリンク
google 6948682462
google 6948682462

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
google 6948682462