2011-01-28 4 views
0

私は非常に奇妙な問題を抱えています。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サービスリクエストとともに送信されたクエリキーと同じ名前が付けられます。

ここで不十分な点がある場合は、詳しい情報をお尋ねください。

ありがとうございます! :)

+0

URLに値をエンコードするとどうなりますか?すなわち[email protected]という名前に%40domain.tld – gigadot

+0

私はあなたがその特定のアプローチで何を得ることができるかを判断することはできませんが、私はそれにクスクスの試みをしました。 URLEncode'ing各項目は違いはありません。また、 'policyAccepted = true'のような特殊文字を持たない項目があることに注意してください。つまり、エンコーディングされません。リクエストの遠端に 'duplicated'として表示されます。 。ご返信いただきありがとうございます。 :) – Dang

+0

doOutputをfalseに設定できますか? dooutputがtrueの場合、リクエストメソッドはPOSTに変更されると私はどこかでそれを読んでいます。これは、各パラメータの値が重複している原因になります。 – gigadot

答えて

1

GETメソッドを使用すると、クエリ文字列がURL文字列に追加されます。 GETメソッドは、HttpURLConnectionのデフォルトのHTTP要求メソッドです。リクエストメソッドを明示的にGETに設定する必要はありません。

GETメソッドを使用して、要求されたURLの内容を取得します。 GET接続の出力ストリームに書き込むべきではありません。

POSTメソッドを使用する場合は、setRequestMethod("POST")で設定できますが、setDoOutput(true)が必要かどうかはわかりません。ただし、setDoOutput(true)は、デフォルトではPOSTに設定されますので、setRequestMethod("POST")も無視してください。 POSTを使用して出力ストリームに書き込む場合は、HttpURLConnectionを使用してこれを行う方法の前回の回答はhereです。

POST(またはPUT)を実行するときに、URLにクエリ部分が含まれないように注意する必要があります。GETPOSTが混在しているため、これは問題の原因になっている可能性がありますが、わかりません。

setRequestMethodsetDoOutput(true)の両方を使用する必要がある場合は、http:// PUTを実行する場合です。

関連する問題