BasicNameValuePair не работает с @ (символом) в значении - Попытка создать HTTP-запрос POST в Android - PullRequest
1 голос
/ 13 сентября 2011

Я пытаюсь создать HTTP-запрос POST в Android, где я передаю «имя пользователя» и «пароль» в качестве переменных POST.

У меня есть код, который работает в большинстве случаев. Однако, когда пароль содержит символ «@», он больше не работает.

Вот мой код

HttpParams params = new BasicHttpParams();
params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
HttpClient httpClient = new DefaultHttpClient(params);
HttpPost post = new HttpPost(url);

List<NameValuePair> postData = new ArrayList<NameValuePair>();
postData.add(new BasicNameValuePair("username", "the_username"));
postData.add(new BasicNameValuePair("password", "the_password"));

post.setEntity(new UrlEncodedFormEntity(postData, HTTP.UTF_8));

HttpResponse response = httpClient.execute(post);

Если «the_password» содержит символ @, например «the_password @», то я не уверен, что POST отправляет по проводам, но я получаю сообщение об ошибке от сервера.

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

Еще больше, если я заменю следующую строку:

post.setEntity(new UrlEncodedFormEntity(postData, HTTP.UTF_8));

с

post.setEntity(new StringEntity("username=the_username&password=the_password@", HTTP.UTF_8));

Тогда все работает - но это не очень хорошее решение, потому что имя пользователя и пароль вводятся пользователем, и я не уверен, как это будет работать, если они передадут строку с амперсандом (&) или равно (=) в он

Есть мысли ??

1 Ответ

0 голосов
/ 13 сентября 2011

Вы уверены, что ваш сервер правильно обрабатывает экранированные URL-адреса параметры?

Если я запускаю это:

List<NameValuePair> postData = new ArrayList<NameValuePair>();
postData.add(new BasicNameValuePair("username", "the_username"));
postData.add(new BasicNameValuePair("password", "the_password@"));

String urlencoform = EntityUtils.toString(new UrlEncodedFormEntity(postData, HTTP.UTF_8));
String directstring = EntityUtils.toString(new StringEntity("username=the_username&password=the_password@", HTTP.UTF_8));

Я получаю:

urlencoform = "username=the_username&password=the_password%40"
directstring = "username=the_username&password=the_password@"

Так что это означаетон «работает» с вашим сервером, если вы отправляете незашифрованные параметры.Это не может быть хорошо.

Любые изменения, чтобы проверить, что сервер получает и как он обрабатывает / не обрабатывает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...