Не удается заставить HttpParams работать с Postrequest

Я не могу получить материал HttpParams из Android-API.

Я просто не хочу отправлять некоторые простые параметры с моим Postrequest. Все работает нормально, за исключением параметров. Код для установки параметров postrequest:

HttpParams params = new BasicHttpParams();
params.setParameter("password", "secret");
params.setParameter("name", "testuser");
postRequest.setParams(params);

Кажется, что этот код не добавляет никакого параметра вообще, так как сервер всегда отвечает, что в моем запросе отсутствует "имя" -параметр.

Пример того, что работает, как ожидалось:

ArrayList<NameValuePair> postParameters = new ArrayList<NameValuePair>();
postParameters.add(new BasicNameValuePair("name", "testuser"));
postParameters.add(new BasicNameValuePair("password", "secret"));
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters);
postRequest.setEntity(formEntity);

Но я хотел бы использовать версию первого примера, поскольку ее легче читать и понимать.

Любые подсказки действительно оценены!

Ответы

Ответ 1

Как только у меня была такая же проблема, и я решил ее так же, как и вы... Помню, я нашел какую-то тему о том, почему это не работает. Это было чем-то вроде реализации библиотеки Apache на стороне сервера.

К сожалению, я не могу найти эту тему сейчас, но если бы я был вами, я бы просто оставил ее работоспособной и не беспокоился бы о "элегантности" кода, потому что, вероятно, и если вы можете, это не практично вообще.

Ответ 2

Пытался заставить его работать первым способом, но кажется, что HttpParams интерфейс не предназначен для этого. Некоторое время спустя я нашел этот SO ответ, объяснив это:

Интерфейс HttpParams не существует для указания параметров строки запроса, для указания поведения во время выполнения объекта HttpClient.

Документация не так специфична, но:

Интерфейс HttpParams представляет собой набор неизменных значений, которые определяют поведение среды выполнения.

Для установки времени соединения и тайм-аута запроса я использовал сочетание как HttpParams, так и List<NameValuePair>, которое полностью функционально и использует класс AndroidHttpClient, доступный из API 8:

public HttpResponse securityCheck(String loginUrl, String name, String password) {
    AndroidHttpClient client = AndroidHttpClient.newInstance(null);
    HttpPost requestLogin = new HttpPost(
            loginUrl + "?");

    //Set my own params using NamaValuePairs
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("j_username", name));
    params.add(new BasicNameValuePair("j_password", password));

    //Set the timeouts using the wrapped HttpParams
    HttpParams httpParameters = client.getParams();
    int timeoutConnection = 3000;
    HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
    int timeoutSocket = 5000;
    HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
    try {
        requestLogin
                .setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
        HttpResponse response = client.execute(requestLogin);
        return response;
    } catch (Exception e) {
        Log.e(TAG, e.getMessage(), e);
        return null;
    }finally {
        client.close();
    }
}

См. также: