マルチパートのHTTPリクエストを送信する方法【Android】

AndroidからマルチパートのHTTPリクエストを送信するプログラムの書き方を紹介します。マルチパートということはファイルの送信と同時に他のパラメータを送信したり、または複数のファイルを同時に送信したりすることができます。覚えておいて、損はありません。

	private void request() {
		// リクエストボディを作成します
		final MediaType TEXT = MediaType.parse("text/plain; charset=utf-8");
		final String BOUNDARY = String.valueOf(System.currentTimeMillis());

		RequestBody requestBody = new MultipartBody.Builder(BOUNDARY)
				.setType(MultipartBody.FORM)
				.addPart(
						Headers.of("Content-Disposition",
								"form-data; name=\"photo_id\""),
						RequestBody.create(TEXT, photo_id)).build();

		// Content-Length の作成
		Buffer buffer = new Buffer();
		String CONTENT_LENGTH = "";
		try {
			requestBody.writeTo(buffer);
			CONTENT_LENGTH = String.valueOf(buffer.size());
		} catch (IOException e) {
			e.printStackTrace();
			CONTENT_LENGTH = "-1";
		} finally {
			buffer.close();
		}

		// リクエストオブジェクトを作る。.post()
		Request request = new Request.Builder()
				.addHeader("Content-Length", CONTENT_LENGTH).url(authUrl)
				.post(requestBody).build();

		// クライアントオブジェクトを作る。
		OkHttpClient client = null;

		// SSL証明書のチェック処理を無効化します。
		OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
		try {
			SSLContext sslContext = SSLContext.getInstance("SSL");
			sslContext.init(null,
					new TrustManager[] { new MyX509TrustManager() },
					new java.security.SecureRandom());
			clientBuilder.sslSocketFactory(sslContext.getSocketFactory(),
					new MyX509TrustManager());
			clientBuilder.hostnameVerifier(new HostnameVerifier() {
				@Override
				public boolean verify(String hostname, SSLSession session) {
					return true;
				}
			});
			client = clientBuilder.build();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (KeyManagementException e) {
			e.printStackTrace();
		}

		// エラー時は標準のクライアントを使用します。
		if (client == null) {
			client = new OkHttpClient();
		}

		// 実行。リクエストして結果を受け取る。
		try {
			Response response = client.newCall(request).execute();
			result.response_data = response.body().string();
			result.response_code = response.code();
			response.close();
			Log.i(TAG, "HTTP_RESPONSE_CODE=[" + result.response_code + "]");
		} catch (SocketTimeoutException e) {
			Log.e(TAG, "接続できませんでした。", e);
		} catch (IOException e) {
			e.printStackTrace();
		}

	}

 

システム開発

Posted by @erestage