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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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コンテナです。

Q&A

解決済

1回答

1832閲覧

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

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コンテナです。

0グッド

0クリップ

投稿2022/06/10 02:22

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

コード

Java

1public ApiGatewayResponse execute(String apiUrl) { 2 // create header 3 Map<String, List<String>> headers = new HashMap<>(); 4 headers.put("Content-type", new ArrayList<String>(Arrays.asList("application/json"))); 5 headers.put("x-api-key", new ArrayList<String>(Arrays.asList("xxx"))); 6 headers.put("x-amz-security-token", new ArrayList<String>Arrays.asList("xxx"))); 7 8 // ★Without this header I get a 400 error★ 9 // headers.put("User-Agent", new ArrayList<String>(Arrays.asList("something"))); 10 11 // create Request 12 SdkHttpFullRequest httpFullRequest = SdkHttpFullRequest 13 .builder() 14 .uri(endPoint) 15 .encodedPath(BASE_REQUEST_PATH + apiUrl) 16 .headers(headers) 17 .method(SdkHttpMethod.GET) 18 .build(); 19 20 // sign 21 Aws4Signer signer = Aws4Signer.create(); 22 Aws4SignerParams aws4SignerParams = Aws4SignerParams.builder() 23 .awsCredentials( 24 AwsBasicCredentials.create( 25 properties.getAccessKey(), 26 properties.getSecretAccessKey())) 27 .signingRegion(Region.of(properties.getRegion())) 28 .signingName(properties.getServiceName()) 29 .build(); 30 SdkHttpFullRequest signedRequest = signer.sign(httpFullRequest, aws4SignerParams); 31 32 // create Request 33 HttpExecuteRequest request = 34 HttpExecuteRequest.builder() 35 .request(signedRequest) 36 .contentStreamProvider(signedRequest.contentStreamProvider().orElse(null)) 37 .build(); 38 39 // set Proxy 40 SdkHttpClient httpClient = ApacheHttpClient 41 .builder() 42 .proxyConfiguration(ProxyConfiguration.builder().endpoint(proxyEndpoint).build()) 43 .build(); 44 45 // call request 46 HttpExecuteResponse response; 47 try { 48 response = httpClient 49 .prepareRequest(request) 50 .call(); 51 System.out.println("【Request】headers"); 52 System.out.println(JSONUtil.toJSON(request.httpRequest().headers())); 53 System.out.println("【Response】BODY"); 54 System.out.println(IoUtils.toUtf8String(response.responseBody().get())); 55 } catch (IOException e) { 56 // error handling.. 57 }

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

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

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

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

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

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

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

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エラーが発生しました。
guest

回答1

0

自己解決

やり方が正しいかわからないですが、とりあえず以下のようにheaderにUser-Agentを追加した。

Java

1this.headers.put("User-Agent", new ArrayList<>(Collections.singletonList(SdkUserAgent.create().userAgent())));

ちなみにV1では以下のようなソースでデフォルトでUser-Agentが入っていたので、その辺りの仕様が変わったっぽい

Java

1 this.signer.sign(request, this.awsCreds); 2 ClientConfiguration clientConfiguration = new ClientConfiguration(); 3 AmazonHttpClient client = new AmazonHttpClient(clientConfiguration); 4 Response<AmazonWebServiceResponse<ApiGatewayResponse>> res = client.requestExecutionBuilder() 5 .request(request) 6 .errorResponseHandler(errorResponseHandler) 7 .execute(responseHandler);

投稿2022/06/15 07:31

okunokento

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問