N00b Pr0grammer
N00b Pr0grammer

Reputation: 4647

How to use HttpURLConnection PUT with query parameters?

How to make a PUT request using HttpURLConnection with query parameters?

I am trying to consume a third party REST API using HttpURLConnection but when I try to pass the parameters in the URL, it doesn't work and throw an error as shown below:

The REST API Url could not be found in the mappings registry

This is the code block that doesn't work for me as of now:

    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)
    {
    }

When I provide these parameters in the Body as form-data parameters, the REST API seems provide the response. My question here is that how do I make this work with HttpURLConnection?

What have I tried till now? I have tried to modify the above to something like below, but it doesn't work.

    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)
    {
    }

EDIT: It throws an error with response code as 500

EDIT: Just to clarify, I'm not trying to upload a file but trying to send the parameters inside the BODY (like Query parameters instead of being sent as URL parameters).

Any pointers or suggestions on this are very much appreciated.

Upvotes: 4

Views: 4825

Answers (2)

dave_thompson_085
dave_thompson_085

Reputation: 39010

You talk about 'query parameters' and 'parameters in the URL', but neither of the approaches you show does any such things. Both your approaches (try to) send parameters in the request body, aka 'entity', not in the URL. Although body contents may be involved in an application-level query, they are NOT query string aka query parameters at the HTTP level. You also ask 'how do I make this work with HttpURLConnection' as if that were a change or difference when both your attempts already use it.

Your first attempt looks almost correct. It should work if you .setRequestProperty("Content-type", "application/x-www-form-urlencoded") (which is not automatic) and your values either are URLencoded or don't need it (no reserved characters) (depending on the server it may be enough to have no ampersand or equalsign)

Your second attempt also is fairly close. You need to write a boundary before the first part as well, and for each part after Content-disposition: form-data; name="blah" you need one CRLF to end that header line and a second CRLF to end the header block. (MIME multipart format allows multiple header lines in general, although in this case only one is needed.) And the end boundary should be followed by a CRLF (after the extra --).

Both only if you have the URL correct, of course. Nothing will work without the correct URL.

Upvotes: 1

Muhammad Hassaan
Muhammad Hassaan

Reputation: 1017

Best Method to Call WebService with HttpUrlConnection PUT Method

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


     }

Upvotes: 0

Related Questions