В Android сделайте запрос POST с данными в кодированной форме URL, не используя UrlEncodedFormEntity - PullRequest
13 голосов
/ 02 декабря 2010

У меня есть строка в правильном формате URLEncoded Form, и я хочу отправить ее через запрос POST на Android на сервер PHP.Я знаю, что метод отправки форм в кодировке URL на Android использует UrlEncodedFormEntity, и я знаю , как его использовать .Проблема в том, что данные поступают в функцию, уже URL-адрес которой закодирован и объединен с помощью амперсандов, поэтому использование UrlEncodedFormEntity потребует много дополнительной работы, чтобы превратить их в List из NameValuePairs, и я бы предпочел этого.

Итак, как мне сделать правильный POST-запрос, отправляющий эту строку в качестве тела контента?

Я уже пытался использовать StringEntity, но PHP-сервер не получил никаких данных (пустой $_POST объект).

Я тестирую против http://test.lifewanted.com/echo.json.php, который просто равен

<?php echo json_encode( $_REQUEST );

Вот пример уже закодированных данных:

partnerUserID = email% 40example.com & partnerUserSecret = mypassword & command = Authenticate

1 Ответ

15 голосов
/ 25 января 2011

Если вы не возражаете против использования HttpURLConnection вместо (рекомендуемого) HttpClient, то вы можете сделать это следующим образом:

public void performPost(String encodedData) {
    HttpURLConnection urlc = null;
    OutputStreamWriter out = null;
    DataOutputStream dataout = null;
    BufferedReader in = null;
    try {
        URL url = new URL(URL_LOGIN_SUBMIT);
        urlc = (HttpURLConnection) url.openConnection();
        urlc.setRequestMethod("POST");
        urlc.setDoOutput(true);
        urlc.setDoInput(true);
        urlc.setUseCaches(false);
        urlc.setAllowUserInteraction(false);
        urlc.setRequestProperty(HEADER_USER_AGENT, HEADER_USER_AGENT_VALUE);
        urlc.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
        dataout = new DataOutputStream(urlc.getOutputStream());
        // perform POST operation
        dataout.writeBytes(encodedData);
        int responseCode = urlc.getResponseCode();
        in = new BufferedReader(new InputStreamReader(urlc.getInputStream()),8096);
        String response;
        // write html to System.out for debug
        while ((response = in.readLine()) != null) {
            System.out.println(response);
        }
        in.close();
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (out != null) {
            try {
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (in != null) {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
...