Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVAhttpurl连接;查询项重复为'paramName=value,value'`paramName=value`应为_Java_Httpurlconnection - Fatal编程技术网

JAVAhttpurl连接;查询项重复为'paramName=value,value'`paramName=value`应为

JAVAhttpurl连接;查询项重复为'paramName=value,value'`paramName=value`应为,java,httpurlconnection,Java,Httpurlconnection,我有一个很奇怪的问题 我的公司为我们的各种财产使用集中的用户注册web服务。我们通常通过HttpURLConnection和请求方法GET向web服务发送请求,并通过qs设置参数。这在过去运作良好 对于我们最近收购并插入注册web服务的另一个属性,HttpURLConnection在发送时似乎在复制参数。参数的预期值是paramName=value,但我们收到的是paramName=value,value。下面是它在我们的日志中的表现: 注意:删除特定于我的雇主和我们的系统的信息 当然,这会导致

我有一个很奇怪的问题

我的公司为我们的各种财产使用集中的用户注册web服务。我们通常通过HttpURLConnection和请求方法GET向web服务发送请求,并通过qs设置参数。这在过去运作良好

对于我们最近收购并插入注册web服务的另一个属性,HttpURLConnection在发送时似乎在复制参数。参数的预期值是
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)
,当您要执行Http
PUT

时,如果您在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();