実現したいこと
- HttpURLConnectionオブジェクトを使用してhttpリクエストを発行し、APIを実行したい
前提
組織内のみで利用しているwebシステムからhttpリクエストを発行し、
インターネット上の配置されているAPIを実行する機能を作成しています。
httpリクエストを発行する処理で、レスポンスコード:411(Length Required)が発生しています。
発生している問題・エラーメッセージ
レスポンスを確認しているコード int statusCode = con.getResponseCode(); if (statusCode == con.HTTP_OK) { system.out.println("success"); system.out.println("STATUS:" + statusCode); system.out.println("MSG:" + con.getResponseMessage()); } else { system.out.println("fault"); system.out.println("STATUS:" + statusCode); system.out.println("MSG:" + con.getResponseMessage()); } コンソール表示 fault STATUS:411 MSG:Length Required
該当のソースコード
Java8
1ソースコード 2 try { 3 // URL作成 4 URL url = new URL("https://hogehoge/post?SYSTEM_ID=" + systemID); 5 // 接続用HttpURLConnectionオブジェクト作成 6 HttpURLConnection con = (HttpURLConnection)url.openConnection(); 7 // リクエストメソッドの設定 8 con.setRequestMethod("POST"); 9 // リクエストのボディ送信を許可 10 con.setDoOutput(true); 11 // リクエストのボディ受信を許可 12 con.setDoInput(true); 13 // ヘッダーの設定 14 con.setRequestProperty("APIKEY", "APIの認証キー"); 15 con.setRequestProperty("Content-Type", "application/json;charset=utf-8"); 16 17 // 接続 18 con.connect(); 19 20 //レスポンス確認 21 int statusCode = con.getResponseCode(); 22 if (statusCode == con.HTTP_OK) { 23 system.out.println("success"); 24 system.out.println("STATUS:" + statusCode); 25 system.out.println("MSG:" + con.getResponseMessage()); 26 } else { 27 system.out.println("fault"); 28 system.out.println("STATUS:" + statusCode); 29 system.out.println("MSG:" + con.getResponseMessage()); 30 } 31 32 con.disconnect(); 33 34 } catch (IOException e) { 35 system.out.println("NG"); 36 // TODO 自動生成された catch ブロック 37 e.printStackTrace(); 38 }
試したこと
レスポンスコード:411は、[Content-Length]の不備が原因とのことだったため、
以下のコード追加して動作検証しました。
結果としてはレスポンス確認している[int statusCode = con.getResponseCode();]の箇所で
エラーが発生するようになり、レスポンス確認すらできない状態になりました。
また、con.getContentLength()のコマンドで設定内容を確認すると常に"-1"が返却され、
con.getRequestProperty("content-length")で設定内容を確認すると設定した値が返却されます。
以下のコードを[con.connect();]の前に追加。
System.setProperty("sun.net.http.allowRestrictedHeaders", "true"); // content-lengthの設定 byte[] data = ("https://hogehoge/post?SYSTEM_ID=" + systemID).getBytes("UTF-8"); con.setRequestProperty("content-length", String.valueOf(data.length));
※HttpURLConnectionでは、[content-length]を設定しても↑の1行目の設定をしないと暗黙的に削除してしまうとの情報があったため追加
補足情報(FW/ツールのバージョンなど)
・APサーバ:Linux
(httpリクエストが通るように対象URLのIPアドレスは許可している)
・フレームワーク:Terasoluna
・使用オブジェクト:HttpURLConnection
(Java8環境で使用できるオブジェクトがこれしか見つからなかったため)
本処理実装に取り掛かってから、3日間調査していますが、解決策が見つかりません。
どうかご協力のほどよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー