如何使用带有查询参数的HttpURLConnection
发出PUT请求?
我正在尝试使用HttpURLConnection
使用第三方REST API,但是当我尝试传递URL中的参数时,它不起作用并抛出错误,如下所示:
在映射注册表
中找不到REST API Url
这是现在对我不起作用的代码块:
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中提供这些参数作为form-data
参数时,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参数发送)。
非常感谢任何关于此的指示或建议。
答案 0 :(得分:1)
您谈论的是“查询参数”和“网址中的参数”,但您展示的这两种方法都不会做任何此类事情。您的两种方法(尝试)都在请求 body 中发送参数,也就是“实体”,而不是在URL中。尽管正文内容可能涉及应用程序级别的查询,但它们不是HTTP级别的查询字符串,也就是查询参数。您还会问'如何使用HttpURLConnection进行此操作',就好像当您的尝试都已使用它时,这是一个变化或差异。
你的第一次尝试几乎是正确的。它应该工作如果
你.setRequestProperty("Content-type", "application/x-www-form-urlencoded")
(这不是自动的)你的值是URL编码的或不需要它(没有保留字符)(取决于服务器它可能足够没有符号或等号)
你的第二次尝试也相当接近。您还需要在第一部分之前写入边界,并且对于Content-disposition: form-data; name="blah"
之后的每个部分,您需要一个CRLF来结束该标题行,并使用第二个CRLF来结束标题块。 (MIME多部分格式通常允许多个标题行,但在这种情况下只需要一个。)并且结束边界后面应该跟一个CRLF(在额外的--
之后)。
当然,只有当你的网址正确时。没有正确的URL,什么都行不了。
答案 1 :(得分:0)
使用HttpUrlConnection PUT方法调用WebService的最佳方法
ApiListener apilistener=null;
public void updateWorker()
{
progressDialog = ProgressDialog.show(myContext, "Message",
progressDialog.setCancelable(false);
progressDialog.setCanceledOnTouchOutside(false);
Thread runThread = new Thread(new Runnable() {
@Override
public void run() {
HttpAppRequest http = new HttpAppRequest();
try {
JSONObject paramObject = new JSONObject();
JSONObject dataObject = new JSONObject();
dataObject.put("id", csId);
}
paramObject.put("data", dataObject);
Log.e(AppConstants.TAG, "Param = " + paramObject.toString());
AppResponse response = http.putJSONData(BASE_URL + "/updateapi", paramObject.toString(), true);
if (response.getStatusCode() == 200) {
String csUpdateResult = response.getContentData();
Log.e(AppConstants.TAG, csUpdateResult);
JSONObject updateObject = new JSONObject(csUpdateResult);
Message completeMessage = handler.obtainMessage(1, updateObject);
completeMessage.sendToTarget();
} else {
handler.sendEmptyMessage(-1);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
String csMessage = myContext.getResources().getString(R.string.id_network_response_failure);
Message completeMessage = handler.obtainMessage(0, csMessage);
completeMessage.sendToTarget();
}
}
});
runThread.start();
}
/*******************************************************************************************************/ Handler Api Response Here
Handler handler= new Handler() {
@Override
public void handleMessage(Message inputMessage) {
progressDialog.dismiss();
if (inputMessage.what == 1) {
try {
JSONObject msgObject = (JSONObject) inputMessage.obj;
if (msgObject.has("result")) {
JSONObject resultObject = msgObject.getJSONObject("result");
if (resultObject.has("status")) {
String csStatus = resultObject.getString("status");
if (csStatus.equalsIgnoreCase("success")) {
apilistener.onUpdate(resultObject.getString("msg"));
}
} else {
if(resultObject.has("status"))
{
apilistener.onFailed(resultObject.getString("reason"));
}
}
}
} catch (JSONException e) {
CommonMethods.showMessageBox("", e.getMessage(), myContext);
}
} else if (inputMessage.what == 0) {
String csMessage = (String) inputMessage.obj;
CommonMethods.showMessageBox("", csMessage, myContext);
}
}
};
//CallBack Listener to parent Activity/Fragment
//User listener like this
public interface ApiListener extends EventListener
{
void onSuccess(String msg);
void onFaiulure(String msg);
}
public void setListener(ApiListener listener)
{
apilistener=listener;
}
}