Как использовать HttpURLConnection PUT с параметрами запроса? - PullRequest
0 голосов
/ 26 апреля 2018

Как сделать запрос PUT, используя HttpURLConnection с параметрами запроса?

Я пытаюсь использовать сторонний REST API, используя HttpURLConnection, но когда я пытаюсь передать параметры в URL, онне работает и выдает ошибку, как показано ниже:

Не удалось найти URL REST API в реестре сопоставлений

Это блок кода, который не 'у меня не работает на данный момент:

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

Когда я предоставляю эти параметры в теле в качестве параметров 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)
    {
    }

EDIT : выдает ошибку с кодом ответа как 500

РЕДАКТИРОВАТЬ : просто чтобы уточнить, я не пытаюсь загрузить файл, но пытаюсь отправить параметры внутри ТЕЛА (например, параметры запроса вместо отправки в качестве параметров URL).

Любые указатели или предложения по этому вопросу очень ценятся.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Вы говорите о «параметрах запроса» и «параметрах в URL», но ни один из подходов, которые вы показываете, не делает ничего подобного.Оба ваших подхода (пытаются) отправлять параметры в запросе body , он же «сущность», а не в URL.Хотя содержимое тела может быть включено в запрос уровня приложения, оно НЕ является строкой запроса, иначе говоря, параметрами запроса на уровне HTTP.Вы также спрашиваете, «как мне заставить эту работу работать с HttpURLConnection», как если бы это было изменение или различие, если обе ваши попытки уже используют его.

Ваша первая попытка выглядит почти правильной.Это должно работать, если вы .setRequestProperty("Content-type", "application/x-www-form-urlencoded") (что не является автоматическим) и ваши значения либо URL-кодированы, либо вам не нужны (без зарезервированных символов) (в зависимости от сервера может быть достаточно, чтобы не было амперсанда или знака равенства)

Ваша вторая попытка также довольно близка.Необходимо также написать границу перед первой частью, и для каждой части после Content-disposition: form-data; name="blah" вам нужен один CRLF, чтобы завершить эту строку заголовка, и второй CRLF, чтобы завершить блок заголовка.(Многочастный формат MIME допускает несколько строк заголовка в целом, хотя в этом случае требуется только одна.) И после конечной границы должен следовать CRLF (после дополнительных --).

Оба, только если выконечно, правильный URL.Ничто не будет работать без правильного URL.

0 голосов
/ 26 апреля 2018

Лучший метод для вызова WebService с методом PUT HttpUrlConnection

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


     }
...