質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

HttpWebRequest

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1302閲覧

GET通信のパラメータ追加時にエンコードする方法(OkHttpClient)

Itis_Beginner

総合スコア1

GET

GETとはHTTPが対応するリクエストメソッドの一つです。クライアントからサーバーへ送られたURLパラメータのデータを取得する時必要がある時に使われます。

HttpWebRequest

HttpWebRequestとは.NETにおけるクラスであり、WebRequestクラスをHTTPに導入するものです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2022/04/15 09:27

編集2022/04/15 09:53

下記のコードについて質問があります。
HttpClient通信でOkHttpClientをJavaで実装中です。
POSTではなくGET通信での話です。
GET通信で渡す時のパラメータで、
現在私が担当しているシステム上、addHeaderだけでなく
.url()のメソッドの中に渡すパラメータもエンコードしなくてはいけないのですが、
どの様にするとエンコードできるでしょうか。
最終的にurlBuilderのパラメータをエンコードしている状態でRequestに詰める事ができればいいので、
どこでどの様にするのかを悩んでいます。
(※"Windows-31J"にエンコードしたいです。)

HttpUrl.Builderに搭載されているaddQueryParameter()は渡す時に
UTF8にしてしまうのでこれは使えません。

何か名案あれば教えて頂けますと幸いです。

Java

1 public ParamTest getTest(Map<String, String> param) { 2 //・・・ 3 //・・・//(割愛) 4 String url = (String) configManager.getConfigValue(DETAIL_URL); 5 6 HttpUrl.Builder urlBuilder = HttpUrl.parse(url).newBuilder(); 7 8 for(Map.Entry<String, String> params : param.entrySet()) { 9 urlBuilder.addEncodedQueryParameter(params.getKey(), params.getValue()); 10 } 11 Request request = new Request.Builder().url(urlBuilder.build()) 12 .addHeader("Content-Type", "application/x-www-form-urlencoded; cahrset=" + "Windows-31J").build(); 13 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2022/04/15 10:04

ご提示のコードが何を意味しているのか分からないのですが…。 Map<String,String> param のデータを key,value の組で URL パラメータに利用したいが、value の方は日本語を Windows-31J に変換しないといけないということでしょうか。
Itis_Beginner

2022/04/15 10:14 編集

文章が足りず大変申し訳ございません。 Map<String,String> param のデータを key,value の組で URL パラメータに利用したいが、 このデータをURLのパラメータに利用する際にWindows-31Jに変更したいです。 >value の方は日本語を Windows-31J に変換しないといけない すみません、この辺りが質問の意味をつかめておりません。 どういう意味でしょうか。
jimbe

2022/04/15 10:31 編集

java は utf16 を使用します。 GET を送ろうとしているサーバが Windows-31j を使用しているために、パラメータを Windows-31j にとされているのではないのでしょうか。 value だけでなく key の方も変換が必要ということでしょうか。
Itis_Beginner

2022/04/15 10:24

>GET を送ろうとしているサーバが Windows-31j を使用しているために、パラメータを Windows-31j にとされているのではないのでしょうか。 まさにその通りで送り先がWindows-31jを使用しているので、それに合わせて変更する必要があります。 なのでこのコードを現在の私が担当しているシステムで実行すると文字化けてしまいます。 >value だけでなく key の方も変換が必要ということでしょうか。 そうです! キーも値もどちらも変換が必要です
jimbe

2022/04/15 10:27

どちらにしてもやることは同じとは思いますが、やりたいことそのままに、文字列を Windows-31J に変換したバイト列を URLエンコーディングして addEncodedQueryParameter すればよいのではないでしょうか。
Itis_Beginner

2022/04/15 10:36

上記コードのparams.getKey()の部分を下記に変更するという事でしょうか params.getKey().getBytes("Windows-31J").toString()
jimbe

2022/04/15 10:50

配列の toString は URL に使える形式ではありません。
guest

回答2

0

こんなメソッドを作ってみるとかは如何でしょうか。

java

1import java.util.*; 2import java.nio.charset.Charset; 3 4public class Main { 5 public static void main(String[] args) throws Exception { 6 System.out.println(getEncodedString("日本語", Charset.forName("Windows-31j"))); 7 } 8 9 static String getEncodedString(String str, Charset charset) { 10 byte[] bytes = str.getBytes(charset); 11 StringBuilder sb = new StringBuilder(); 12 for(byte b : bytes) sb.append(String.format("%%%02x", b)); 13 return sb.toString(); 14 } 15}

結果

plain

1%93%fa%96%7b%8c%ea

投稿2022/04/15 10:52

jimbe

総合スコア12646

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

URLエンコーディングに関しては標準のjava.net.URLEncoderクラスが使えます。このクラスのencodeメソッドを使ってキーと値を個別にエンコードするのが簡便でしょう。文字セットとして少なくともWindows上なら"Windows-31J"もそのまま使えました。以下はそのサンプルコードです。

Java

1import java.io.UnsupportedEncodingException; 2import java.net.URLEncoder; 3 4public class JTest02 { 5 public static void main(String[] args) { 6 7 try { 8 String encodedKey; 9 String encodedValue; 10 11 encodedKey = URLEncoder.encode("key1", "Windows-31J"); 12 encodedValue = URLEncoder.encode("value1", "Windows-31J"); 13 System.out.printf("key=[%s], value=[%s]\n", encodedKey, encodedValue); 14 15 encodedKey = URLEncoder.encode("キー2", "Windows-31J"); 16 encodedValue = URLEncoder.encode("値2", "Windows-31J"); 17 System.out.printf("key=[%s], value=[%s]\n", encodedKey, encodedValue); 18 } catch (UnsupportedEncodingException ex) { 19 ex.printStackTrace(); 20 } 21 } 22} 23

上記のコードをEclipse (JavaSE-1.8)で試した実行結果です。

terminal

1key=[key1], value=[value1] 2key=[%83%4C%81%5B2], value=[%92%6C2]

ちなみについ先日、関連した質問がありましたのでご参考までにそちらへのリンクも張っておきます。こちらはApache Commons Codec の URLCodecを利用された例です。

クエリパラメータの値として"="(イコール)や"&"(アンパサンド)を設定したい。

投稿2022/04/16 03:13

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問