如何将HttpURLConnection PUT与查询参数一起使用?

时间:2018-04-26 05:54:03

标签: java rest httpurlconnection

如何使用带有查询参数的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("&parameter2_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参数发送)。

非常感谢任何关于此的指示或建议。

2 个答案:

答案 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;
                }


     }