JAVAhttpurl连接;查询项重复为'paramName=value,value'`paramName=value`应为
我有一个很奇怪的问题 我的公司为我们的各种财产使用集中的用户注册web服务。我们通常通过HttpURLConnection和请求方法GET向web服务发送请求,并通过qs设置参数。这在过去运作良好 对于我们最近收购并插入注册web服务的另一个属性,HttpURLConnection在发送时似乎在复制参数。参数的预期值是JAVAhttpurl连接;查询项重复为'paramName=value,value'`paramName=value`应为,java,httpurlconnection,Java,Httpurlconnection,我有一个很奇怪的问题 我的公司为我们的各种财产使用集中的用户注册web服务。我们通常通过HttpURLConnection和请求方法GET向web服务发送请求,并通过qs设置参数。这在过去运作良好 对于我们最近收购并插入注册web服务的另一个属性,HttpURLConnection在发送时似乎在复制参数。参数的预期值是paramName=value,但我们收到的是paramName=value,value。下面是它在我们的日志中的表现: 注意:删除特定于我的雇主和我们的系统的信息 当然,这会导致
paramName=value
,但我们收到的是paramName=value,value
。下面是它在我们的日志中的表现:
注意:删除特定于我的雇主和我们的系统的信息
当然,这会导致端点验证出错并禁用用户注册
以下是用于创建连接的代码的表示形式:
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是正确的/符合我们的预期,每个参数只有一个值
- 发起表单的post字段的名称与web服务请求发送的查询键的名称相同
先谢谢你!:) 使用
GET
方法时,查询字符串将添加到URL字符串中。GET
方法是HttpURLConnection
的默认Http请求方法。您不需要显式地将请求方法设置为GET
使用GET
方法获取请求URL的内容。您不应该写入GET
连接的输出流
如果您想使用POST
方法,可以通过setRequestMethod(“POST”)
进行设置,但我不确定您是否也需要setDoOutput(true)
。但是,默认情况下,setDoOutput(true)
会将请求方法设置为POST
,因此您最好忽略setRequestMethod(“POST”)
。如果您想使用POST
写入输出流,这是我之前关于如何使用HttpURLConnection
的回答
需要注意的是,当您执行POST
(或PUT
)时,URL不应包含查询部分。由于您同时拥有GET
和POST
,这可能是您的问题的原因,但我不确定
在一种可能的情况下,您必须同时使用
setRequestMethod
和setDoOutput(true)
,当您要执行HttpPUT
时,如果您在url中编码值会发生什么?即name@domain.tld命名为%40domain.tldal虽然我无法确定您使用这种特殊方法会得到什么,但我还是尝试了一下。对每个项目进行URL编码并没有什么区别。另外,值得一提的是,有些项目没有特殊字符,例如policyAccepted=true
——因此不会被编码——它们在请求的远端显示为“重复”。感谢您抽出时间回复。:)你能把输出设为假吗?我在某个地方读到,如果dooutput为true,请求方法将更改为POST。这可能是每个参数都有重复值的原因。我不知道为什么在使用GET时要将某些内容打印到输出流中。GET方法仅用于从服务器获取内容。如果您想发布,使用setDoOutput(true)就足够了。不需要设置RequestMethod(“POST”)。
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();