如何使用带有查询参数的HttpURLConnection发出PUT请求?
我正在尝试使用HttpURLConnection使用第三方REST API,但是当我尝试传递URL中的参数时,它不起作用并抛出错误,如下所示:
The REST API Url could not be found in the mappings registry
这是迄今为止对我不起作用的代码块:
URL url;
StringBuffer response = new StringBuffer();
try
{
url = new URL(" http://thirdparty.com/party/api/v2/ksp/12/ks");
HttpURLConnection httpURL = (HttpURLConnection) url.openConnection();
httpURL.setDoOutput(true);
httpURL.setRequestMethod("PUT");
StringBuilder sbUrl = new StringBuilder("parameter1_id=");
sbUrl.append(getParameter1Value())
.append("¶meter2_id=")
.append(getParameter2Value());
final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(httpURL.getOutputStream()));
writer.write(sbUrl.toString());
writer.flush();
writer.close();
// throw the exception here in case invocation of web service
if (httpURL.getResponseCode() != 200)
{
// throw exception
}
else
{
//SUCCESS
}
}
catch (IOException e)
{
}
当我在Body中提供这些参数作为表单数据参数时,REST API似乎提供了响应.
我的问题是如何使用HttpURLConnection进行此操作?
我到现在为止做了什么?
我试图修改上面的内容,但它不起作用.
try
{
url = new URL(" http://thirdparty.com/party/api/v2/ksp/12/ks");
HttpURLConnection httpURL = (HttpURLConnection) url.openConnection();
httpURL.setDoOutput(true);
httpURL.setRequestMethod("PUT");
httpURL.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + "----WebKitFormBoundarydklhfklsdfhlksh");
dataOutputStream = new DataOutputStream(urlConnection.getOutputStream());
dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"parameter1_id\"");
dataOutputStream.writeBytes("\r\n" + "parameter1Value" +"\r\n");
dataOutputStream.writeBytes("--" + "----WebKitFormBoundarydklhfklsdfhlksh");
dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"parameter2_id\"");
dataOutputStream.writeBytes("\r\n" + "parameter2Value" + "\r\n");
dataOutputStream.writeBytes("--" + "----WebKitFormBoundarydklhfklsdfhlksh" + "--");
dataOutputStream.flush();
dataOutputStream.close();
urlConnection.connect();
// throw the exception here in case invocation of web service
if (httpURL.getResponseCode() != 200)
{
// throw exception
}
else
{
//SUCCESS
}
}
catch (IOException e)
{
}
编辑:它引发错误,响应代码为500
编辑:只是为了澄清,我不是试图上传文件,而是尝试在BODY中发送参数(如查询参数而不是作为URL参数发送).
任何关于此的指示或建议都非常感谢.
最佳答案 你谈论’查询参数’和’URL中的参数’,但你展示的方法都没有做任何这样的事情.您的方法(尝试)都在请求正文中发送参数,即“实体”,而不是在URL中.尽管正文内容可能涉及应用程序级别的查询,但它们不是HTTP级别的查询字符串,也就是查询参数.您还会问’我如何使用HttpURLConnection进行此操作’,就好像当您的尝试都已使用它时,这是一个变化或差异.
你的第一次尝试几乎是正确的.它应该工作如果
你.setRequestProperty(“内容类型”,“application / x-www-form-urlencoded”)(这不是自动的)你的值是URLencoded或不需要它(没有保留字符)(取决于服务器)没有符号或等号可能就足够了)
你的第二次尝试也相当接近.你需要在第一部分之前写一个边界,并在Content-disposition之后为每个部分写一个:form-data; name =“blah”你需要一个CRLF来结束那个标题行,第二个CRLF结束标题块. (MIME多部分格式通常允许多个标题行,但在这种情况下只需要一个.)并且结束边界后面应该跟一个CRLF(在额外 – 之后).
当然,两者都只有你的URL正确.没有正确的URL,什么都行不通.