我遇到了一个非常奇怪的问题。
我的公司为我们的各种 Assets 使用集中式用户注册网络服务。我们一般通过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 正确/符合我们的预期,每个参数都有单个值。
- 发起表单的发布字段的名称与随网络服务请求发送的查询键的名称相同。
如果您发现此处内容不足,请索取更多信息。
提前谢谢您! :)
最佳答案
当您使用GET
时方法中,查询字符串被添加到 URL 字符串中。 GET
method 是 HttpURLConnection
的默认 Http 请求方法。您无需显式将请求方法设置为 GET
.
一个GET
方法用于获取请求的URL的内容。您不应该写入 GET
的输出流连接。
如果您想使用POST
方法,可以通过 setRequestMethod("POST")
设置但我不确定你是否需要setDoOutput(true)
以及。然而,setDoOutput(true)
默认情况下,将请求方法设置为 POST
所以你不妨忽略 setRequestMethod("POST")
。如果您想使用 POST
写入输出流, here是我之前关于如何使用 HttpURLConnection
进行操作的答案.
需要注意的是,当你执行 POST
时(或 PUT
),URL 不应包含查询部分。因为你有 GET
的混合物和POST
,这可能是您问题的原因,但我不确定。
一种可能的情况是您必须同时使用 setRequestMethod
和setDoOutput(true)
就是当你想做一个 Http PUT
.
关于 java ; HttpURL连接;查询项重复为 `paramName=value, value` 。预计为 `paramName=value`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4832781/