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

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

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

Keycloakとは、一度の認証で多くのシステム利用が可能になるシングルサインオン(SSO)のオープンソースソフトウェアです。OpenID ConnectやSAMLなどのシングルサインオンのプロトコルに対応。IdPとして用いることができます。ソーシャルサービスでの認証機構の利用も可能です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Java

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

Q&A

解決済

2回答

5625閲覧

HttpURLConnectionを用いてJavaでJsonをPOSTする方法

popomi

総合スコア1

Keycloak

Keycloakとは、一度の認証で多くのシステム利用が可能になるシングルサインオン(SSO)のオープンソースソフトウェアです。OpenID ConnectやSAMLなどのシングルサインオンのプロトコルに対応。IdPとして用いることができます。ソーシャルサービスでの認証機構の利用も可能です。

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Java

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

0グッド

0クリップ

投稿2021/12/03 02:38

前提・実現したいこと

HttpURLConnectionを__h__用いてJavaでJsonをPOSTする方法を教えてください。
具体的にやろうとしていることをお伝えすると、KeycloakのREST APIを呼び出すために、アクセストークンを取得する必要があります。そのため、必要情報をPOSTしてアクセストークンを取得しようとしているのですが、うまくできず。。

発生している問題・エラーメッセージ

失敗している箇所ですが、
BufferedReader br = new BufferedReader(new InputStreamReader(urlconn.getInputStream(), "UTF-8"));
の部分で、以下のエラーが出てしまいます。
java.io.IOException: Server returned HTTP response code: 415 for URL: https://localhost:8443/auth/realms/master/protocol/openid-connect/token

該当のソースコード

String json = "{" + ""username": "XXX"," + ""password": "XXX"," + ""grant_type": "XXX","

  • ""client_id": "XXX"" + "}";

public void callPost() {

/* 証明書エラーを無視するための処理Start*/
~割愛~
/* 証明書エラーを無視するための処理End*/

// URLの設定
URL connectUrl = new URL("https://localhost:8443/auth/realms/master/protocol/openid-connect/token");
HttpsURLConnection urlconn = (HttpsURLConnection) connectUrl.openConnection();
((HttpsURLConnection) urlconn).setSSLSocketFactory(sslcontext.getSocketFactory());

// HttpURLConnectionの各種設定
urlconn.setRequestMethod("POST");
urlconn.setDoInput(true);
urlconn.setDoOutput(true);
urlconn.setRequestProperty("Content-Type", "application/json; charset=utf-8");

// 接続を確立する
urlconn.connect();

// リクエスとボディに書き込みを行う
PrintStream ps = new PrintStream(urlconn.getOutputStream());
ps.print(json);
ps.close();

// レスポンスを受け取る
//正常終了時はHttpStatusCode 200が返ってくる
if (urlconn.getResponseCode() != 200) {
//エラー処理
}

//HttpURLConnectionからInputStreamを取得し、読み出す
BufferedReader br = new BufferedReader(new InputStreamReader(urlconn.getInputStream(), "UTF-8"));

StringBuilder sb = new StringBuilder();
String line;

while ((line = br.readLine()) != null) {
sb.append(line);
}

// InputStreamを閉じる
br.close();

} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
以降割愛。

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

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

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

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

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

dodox86

2021/12/03 02:58

質問文中のソースコードは、マークダウン記法を用いて提示しましょう。そうでないとインデントなど崩れ、大変読みづらくなります。また、読みづらい質問はそれだけで回答が離れがちとなります。 [質問するときのヒント] https://teratail.com/help/question-tips 他、参考になる質問回答: [teratail初心者で、質問もまだ2回目で、質問欄にソースコード載せる場合、<code>を押してからどのように書くかを、教えて欲しいです] https://teratail.com/questions/238564
popomi

2021/12/06 04:50

コメントありがとうございます。 こちらのサイトを使うのが初めてだったため、お作法的なとこが分からず、ご指摘いただいて大変参考になります。 今後質問する際は、マークダウン記法を用いて投稿致します。
guest

回答2

0

ベストアンサー

HTTP レスポンスコードの 415 は、Unsupported Media Type の模様です。

こちらの keycloakのドキュメント をちらっと見た感じでは、

curl
-d "client_id=admin-cli"
-d "username=admin"
-d "password=password"
-d "grant_type=password"
"http://localhost:8080/auth/realms/master/protocol/openid-connect/token"

でお試しする API のようですので、
application/json ではなく、application/x-www-form-urlencoded 形式を試されてみてはいかがですか。

client_id=admin-cli&username=admin&password=password&grant_type=password

投稿2021/12/04 15:24

momodx

総合スコア185

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

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

popomi

2021/12/06 04:52

コメントありがとうございます、形式を変えたらうまくいきました。助かりました、ありがとうございます!!!
guest

0

Java11以降なら、HttpURLConnectionとたたかうよりは、https://docs.oracle.com/javase/jp/11/docs/api/java.net.http/java/net/http/HttpClient.htmlを使うのが簡単だとおもいます。

投稿2021/12/03 08:51

shiketa

総合スコア4061

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

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

popomi

2021/12/06 04:54

コメントありがとうございます。 今回は別の方の回答が問題解決につながりましたが。shiketaさんのコメントも実装にあたり参考になります!ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問