Java的; HttpURLConnection的;查询项目重复为`paramName = value,value`。 'paramName = value`预期

时间:2011-01-28 20:32:39

标签: java httpurlconnection

我有一个非常奇怪的问题。

我的公司为我们的各种房产使用集中的用户注册网络服务。我们通常通过HttpURLConnection通过请求方法GET向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&emailAddress=name@domain.tld&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是正确的/我们期望的,每个参数都有单个值。
  • 初始表单的帖子字段的名称与使用Web服务请求发送的查询键的名称相同。

如果您发现这里的内容不足,请询问更多信息。

提前谢谢! :)

1 个答案:

答案 0 :(得分:1)

使用GET方法时,查询字符串将添加到URL字符串中。 GET方法是HttpURLConnection的默认Http请求方法。您无需将请求方法明确设置为GET

GET方法用于获取请求的URL的内容。您不应该写入GET连接的输出流。

如果您想使用POST方法,可以通过setRequestMethod("POST")进行设置,但我不确定您是否还需要setDoOutput(true)。但是,默认情况下,setDoOutput(true)会将请求方法设置为POST,因此您也可以忽略setRequestMethod("POST")。如果您想使用POST写入输出流,here是我之前使用HttpURLConnection进行操作的答案。

应该注意的是,当您执行POST(或PUT)时,该网址不应包含查询部分。由于您混合使用GETPOST,这可能是您遇到问题的原因,但我不确定。

您必须同时使用setRequestMethodsetDoOutput(true)的一种可能情况是,您希望执行Http PUT