私は非常に奇妙な問題を抱えています。Java; HttpURLConnection; `paramName = value、value`として複製されたクエリ項目。 `paramName = value`が必要です
私の会社では、さまざまなプロパティに対して集中ユーザー登録Webサービスを使用しています。私たちは一般的にリクエストメソッドGETでHttpURLConnectionを介してWebサービスにリクエストを送り、qsを介してパラメータを設定します。これは過去にうまくいっています。
私たちが最近取得して登録Webサービスに接続した別のプロパティの場合、HttpURLConnectionは送信時にパラメータを複製しているようです。パラメータの期待値はparamName=value
ですが、代わりにparamName=value, value
が送信されています。ログ内にどのように表示されるかは次のとおりです。
注:私の雇用主とシステム固有の情報を削除してください。
01-26 15:21:54 [TP-Processor17] INFO com].[/] - parameter=userName=nameValue65, nameValue65
01-26 15:21:54 [TP-Processor17] INFO com].[/] - parameter=policyAccepted=true, true
これは、もちろん、エンドポイントの検証がユーザ登録をエラーおよび無効にするために起因します。ここで
接続を作成するために使用されるコードの表現です:(?)
URL url = new URL("http://account-ws.domain.tld/register.action?responseType=json&userName=nameValue65&age=24&country=US&password1=Passw3rt&[email protected]&tosAccepted=true&policyAccepted=true");
HttpURLConnection urlc = (HttpURLConnection) url.openConnection();
urlc.setRequestMethod("GET");
urlc.setDoOutput(true);
urlc.setAllowUserInteraction(false);
PrintStream ps = new PrintStream(urlc.getOutputStream());
ps.print(restEndPoint);
ps.close();
おそらく便利な情報:
- 登録フォームは、POSTを使用して自分自身に提出し、我々は検証その時点でStrutsフォームを使用して、Strutsフォームの検証クラスから返された値を使用してリクエストをWebサービスに送信します。
- Wiresharkとlog4jのデバッグメッセージは、Webサービスに送信されたURLが正しいことを示しています(それぞれのパラメータに1つの値があります)。
- 開始フォームの投稿フィールドには、Webサービスリクエストとともに送信されたクエリキーと同じ名前が付けられます。
ここで不十分な点がある場合は、詳しい情報をお尋ねください。
ありがとうございます! :)
URLに値をエンコードするとどうなりますか?すなわち[email protected]という名前に%40domain.tld – gigadot
私はあなたがその特定のアプローチで何を得ることができるかを判断することはできませんが、私はそれにクスクスの試みをしました。 URLEncode'ing各項目は違いはありません。また、 'policyAccepted = true'のような特殊文字を持たない項目があることに注意してください。つまり、エンコーディングされません。リクエストの遠端に 'duplicated'として表示されます。 。ご返信いただきありがとうございます。 :) – Dang
doOutputをfalseに設定できますか? dooutputがtrueの場合、リクエストメソッドはPOSTに変更されると私はどこかでそれを読んでいます。これは、各パラメータの値が重複している原因になります。 – gigadot