0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Android6.0 ApacheHTTPClientからURLConnectionへの置き換え

Last updated at Posted at 2022-04-13

自分が失敗したならあと10人は失敗しているだろう(ゴキブリ理論)
タイトル対応中にmultipartで詰まった、ということで失敗備忘録です。

multipartでテキストと画像データをPost

以下を参考に実装

問題発生

サーバーへテキストと画像を送信できた。がしかし、テキスト内の日本語が文字化けしている。
1.日本語以外(英字/数字)は文字化けなし。
2.画像は壊れることなく送信できている。

原因

DataOutputStreamへの書き込みを直接writeBytesで実装しているため、
AndroidOS標準の文字コード(UTF-8以外のなにか(未調査))でエンコードされていた。

対応

writeBytesは使用せず、一度StringBuilderであつめてからByte変換するようにした。

RestUtility.java
// 以下内容は参考元より多少の改変をしています
final String BOUNDARY=  "**BOUNDARY**";
final String lineEnd = "\r\n";

DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
StringBuilder builder = new StringBuilder();

// 一度StringBuilderに格納し
builder.append("--").append(BOUNDARY).append(lineEnd);
builder.append("Content-Disposition: form-data;name=\"").append(entry.getKey()).append("\"").append(lineEnd);
builder.append("Content-Type: text/plain; charset=UTF-8").append(lineEnd);
builder.append("Content-Transfer-Encoding: 8bit").append(lineEnd);
builder.append(lineEnd);
builder.append(entry.getValue());
builder.append(lineEnd);

// UTF-8を指定してByte変換(DataOutputStreamの関数を使用しない)
outputStream.write(builder.toString().getBytes(StandardCharsets.UTF_8));

あとがき

気づいてみればごくごく普通のことだった。
文字コードが絡んだならば、厳戒態勢を敷こう!!!!!

オイオイオイオイ!!
もっといい書き方があるぜぇ!!!!!

というとき、すみませんがコメントにてご指摘ください。

参考

Apache HTTP Client の削除

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?