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

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

新規登録して質問してみよう
ただいま回答率
87.20%
HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

Java

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

SDK

SDK(software development kit)は特定のハードウェアのプラットフォーム、開発環境又はソフトウェアパッケージでソフトウェアをつくるのに必要な開発ツールのセットです。SDKはAPI、IDE又は他の開発ツールとフレームワークを組み合わせたもので構成されていることがあります。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Apache Tomcat

Apache TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

解決済

(awssdk v2)ApacheHttpClientリクエストのヘッダー'user-agent'が空になる

okunokento
okunokento

総合スコア10

HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

Java

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

SDK

SDK(software development kit)は特定のハードウェアのプラットフォーム、開発環境又はソフトウェアパッケージでソフトウェアをつくるのに必要な開発ツールのセットです。SDKはAPI、IDE又は他の開発ツールとフレームワークを組み合わせたもので構成されていることがあります。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Apache Tomcat

Apache TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

1回答

0評価

0クリップ

263閲覧

投稿2022/06/10 02:22

AWS SDK(バージョン:2.17.201)を使用してAPIGatewayにリクエストを送信しようとしています。
しかし、ヘッダーに「user-agent」がないため、400エラーが発生します。
書き方が悪いのか、インフラの問題なのか、何かご存じの方教えて欲しいです。

コード

Java

public ApiGatewayResponse execute(String apiUrl) { // create header Map<String, List<String>> headers = new HashMap<>(); headers.put("Content-type", new ArrayList<String>(Arrays.asList("application/json"))); headers.put("x-api-key", new ArrayList<String>(Arrays.asList("xxx"))); headers.put("x-amz-security-token", new ArrayList<String>Arrays.asList("xxx"))); // ★Without this header I get a 400 error★ // headers.put("User-Agent", new ArrayList<String>(Arrays.asList("something"))); // create Request SdkHttpFullRequest httpFullRequest = SdkHttpFullRequest .builder() .uri(endPoint) .encodedPath(BASE_REQUEST_PATH + apiUrl) .headers(headers) .method(SdkHttpMethod.GET) .build(); // sign Aws4Signer signer = Aws4Signer.create(); Aws4SignerParams aws4SignerParams = Aws4SignerParams.builder() .awsCredentials( AwsBasicCredentials.create( properties.getAccessKey(), properties.getSecretAccessKey())) .signingRegion(Region.of(properties.getRegion())) .signingName(properties.getServiceName()) .build(); SdkHttpFullRequest signedRequest = signer.sign(httpFullRequest, aws4SignerParams); // create Request HttpExecuteRequest request = HttpExecuteRequest.builder() .request(signedRequest) .contentStreamProvider(signedRequest.contentStreamProvider().orElse(null)) .build(); // set Proxy SdkHttpClient httpClient = ApacheHttpClient .builder() .proxyConfiguration(ProxyConfiguration.builder().endpoint(proxyEndpoint).build()) .build(); // call request HttpExecuteResponse response; try { response = httpClient .prepareRequest(request) .call(); System.out.println("【Request】headers"); System.out.println(JSONUtil.toJSON(request.httpRequest().headers())); System.out.println("【Response】BODY"); System.out.println(IoUtils.toUtf8String(response.responseBody().get())); } catch (IOException e) { // error handling.. }

400エラーの内容

【Request】headers {Authorization":["AWS4-HMAC-SHA256 Credential=xxx, SignedHeaders=content-type;host;x-amz-date;x-amz-security-token;x-api-key, Signature=xxx"], Content-type":["application/json;charset=UTF-8"], Host":["xxx"], X-Amz-Date":["20220609T075444Z"], x-amz-security-token":["xxx"], x-api-key":["xxx"] } 【Response】BODY <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> <HTML> <HEAD> <TITLE>Bad Request</TITLE> <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"> </HEAD> <BODY> <h2>Bad Request - Invalid Header</h2> <hr> <p>HTTP Error 400. The request has an invalid header name.</p> </BODY> </HTML>

ApacheHttpClientのソースを見ると、意図的に消しているっぽいです。
software.amazon.awssdk.http.apache.ApacheHttpClient 153rows

Java

builder.setRequestExecutor(new HttpRequestExecutor()) // SDK handles decompression .disableContentCompression() .setKeepAliveStrategy(buildKeepAliveStrategy(standardOptions)) .disableRedirectHandling() .disableAutomaticRetries() .setUserAgent("") // SDK will set the user agent header in the pipeline. Don't let Apache waste time .setConnectionReuseStrategy(new SdkConnectionReuseStrategy()) .setConnectionManager(ClientConnectionManagerFactory.wrap(cm));

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

maisumakun

2022/06/10 02:35

エラーメッセージに「The request has an invalid header name」と書いてあるのに、原因が「user-agentが送られないこと」だと判断したのはなぜでしょうか。
okunokento

2022/06/10 05:15

’user-agent’をheaderに追加すると、エラーが発生しなくなるからです。 // headers.put("User-Agent", new ArrayList<String>(Arrays.asList("something"))); Postmanなどでも試しましたが、’user-agent’を空すると同じ400エラーが発生しました。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

HTTPヘッダー

Hypertext Transfer Protocol(HTTP)の中のHTTPヘッダフィールドはHTTPの要求やレスポンスの機能しているパラメーターが含まれます。その要求もしくはレスポンスライン(メッセージの最初の一行)でメッセージヘッダを作ります。

Java

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

SDK

SDK(software development kit)は特定のハードウェアのプラットフォーム、開発環境又はソフトウェアパッケージでソフトウェアをつくるのに必要な開発ツールのセットです。SDKはAPI、IDE又は他の開発ツールとフレームワークを組み合わせたもので構成されていることがあります。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Apache Tomcat

Apache TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。