Android - параметры POST HttpURLConnection не работают

Я использую HttpURLConnection для связи с веб-службой в одном из моих приложений для Android, метод и параметры GET отправляются правильно, но когда я пытался отправить запрос POST, параметры POST не отправляются в запросе. Я прикрепил используемый метод, пожалуйста, подскажите, где я ошибаюсь.

/*
 * Making service call
 * @url - url to make request
 * @method - http request method
 * @params - http request params
 * */
public String makeServiceCall(String request_url, int method,
                              Map<String,String> params) {
    InputStream inputStream = null;

    HttpURLConnection urlConnection = null;

    Integer result = 0;
    try {
        URL url = new URL(request_url);
        urlConnection = (HttpURLConnection) url.openConnection();
        //urlConnection.setRequestProperty("Content-Type", "application/xml");
        //urlConnection.setRequestProperty("Accept", "application/xml");
        urlConnection.setReadTimeout(10000);
        urlConnection.setConnectTimeout(15000);
        urlConnection.setDoInput(true);
        urlConnection.setDoOutput(true);
        if (method == GET) {
            urlConnection.setRequestMethod("GET");
        } else if(method == POST) {
            urlConnection.setRequestMethod("POST");
            String urlParameters = null;
            for (Map.Entry<String, String> entry : params.entrySet()) {
                System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
                if(urlParameters != null)
                {
                    urlParameters += "&";
                }
                urlParameters +=entry.getKey() +"="+ URLEncoder.encode(entry.getValue(), "UTF-8");
            }
            Log.d(TAG, "urlParameters: "+urlParameters);
            //Send request
            OutputStream os = urlConnection.getOutputStream();
            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(os, "UTF-8"));
            writer.write(urlParameters);
            writer.flush ();
            writer.close ();
        }
        int statusCode = urlConnection.getResponseCode();
        if (statusCode == HttpsURLConnection.HTTP_OK) {

            inputStream = new BufferedInputStream(urlConnection.getInputStream());

            response = convertInputStreamToString(inputStream);


            result = 1; // Successful

        } else {
            result = 0; //"Failed to fetch data!";
        }

    } catch (Exception e) {
        Log.d(TAG, ""+e.getLocalizedMessage());
        e.printStackTrace();
    }
    Log.d(TAG, ""+response);
    return response;

}

person Hari Swaminathan    schedule 18.11.2015    source источник


Ответы (2)


Измените логику формирования urlParameters с помощью кода ниже:

StringBuilder result = new StringBuilder();
try {
    for (Map.Entry<String, String> param : params.entrySet()){
        if (result.toString().length() !=0) {
            result.append("&");
        }
        result.append(URLEncoder.encode(param.getKey(), "UTF-8"));
        result.append("=");
        result.append(URLEncoder.encode(param.getValue(), "UTF-8"));
     }
} catch (UnsupportedEncodingException e) {
     e.printStackTrace();
}

В вашем коде

 urlParameters = null;
 urlParameters +=entry.getKey() +"="+ URLEncoder.encode(entry.getValue(), "UTF-8");

Добавит строку null в начало urlParameters. рекомендуется использовать StringBuilder вместо String concatenation при использовании в цикле.

person Dhaval Patel    schedule 18.11.2015
comment
как насчет того, если значение params содержит символ &, как это 38418389/ есть предложения? - person Iqbal Rizky; 17.07.2016

Попробуйте закрыть свой OutputStream и вызвать httpURLConnection.connect() после того, как вы закончите с вашим писателем:

...
writer.flush();
writer.close();
os.close();
urlConnection.connect();
...
person Orkun Kocyigit    schedule 18.11.2015
comment
Пробовал, но без разницы. Запись BufferedWriter = новый BufferedWriter( новый OutputStreamWriter(os, UTF-8)); писатель.написать (urlParameters); писатель.flush(); писатель.закрыть (); ос.закрыть(); URLConnection.connect(); - person Hari Swaminathan; 18.11.2015