Кодировать URL-адрес, содержащий JSONArray - PullRequest
2 голосов
/ 25 сентября 2010

У меня есть приложение для Android, которое я пытаюсь использовать для передачи некоторых данных в веб-сервис с использованием HTTPGet.Если я просто создаю строку, используя метод JSONArray.toString (), я получаю URL, который выглядит примерно так:

http://xxx.xx.xxx.xx/api?method=upload&args[deviceID]=123456789&args[data]=["{element1=93295352, element2=235235, element3=3523523}","{element1=93295352, element2=235235, element3=3523523}"]

Это не работает из-за пробелов и кавычек вURL.Если я попытаюсь сделать что-то вроде следующего:

JSONArray ja = new JSONArray();

// Add Data to JSONArray

String s = ja.toString();

// Add array to StringBuilder url

HTTPGet httpget = new HTTPGet(UrlEncoder.encode(url.toString()));

Я получу сообщение об ошибке, потому что весь URL закодирован и заканчивается следующим образом:

http%3A%2F%2Fxxx.xx.xxx.xx%2Fapi%3Fmethod%3Dupload%26args%5BdeviceID%5D%3D123456879%26args%5Bdata%5D%3D%5B%22%7Belement1%3D915156028000%2C+element2%3D1651651%2C+element3%3D489461%7D%22%2C%22

Очевидно, это не 'Это то, что я ищу, и должно быть лучшее решение, чем поиск / замена всех необходимых символов в части JSONArray этого URL, хотя я полагаю, что делать это таким образом не будет большой проблемой, так как ябеспокоятся только о кавычках и пробелах.

Обратите внимание, что ручное вставление этого кода в браузер вернуло ожидаемые результаты:

http://xxx.xx.xxx.xx/api?method=upload&args[deviceID]=123456789&args[data]=[%22{element1=915156028000,%20element2=0.0,%20element3=2.297444}%22,%22{element1=915156055000,%20element2=0.0,%20element3=2.2974419999999998}%22]

1 Ответ

6 голосов
/ 25 сентября 2010

Вам необходимо URL кодировать просто аргумент запроса значение ;например,

JSONArray ja = new JSONArray();

// Add Data to JSONArray

String s = UrlEncoder.encode(ja.toString());

// Add string to StringBuilder url

HTTPGet httpget = new HTTPGet(url.toString());

Еще одна вещь, о которой вам нужно знать, это то, что существуют практические ограничения на длину URL.Эти ограничения варьируются от одной реализации к другой (браузер, сервер, прокси, клиентская библиотека HTTP и т. Д.).В некоторых случаях это всего лишь 2 Кбайт, IIRC.

СЛЕДУЙТЕ ЗА *

Если я хочу сделать то же самое, используя вместо него POST, сделайтеЯ заканчиваю тем, что должен был закодировать данные таким же образом?

Это зависит.

  • Если вы отправили аргументы в качестве аргументов URL-запроса с POST, применимы те же правила и ограничения кодирования.Для записи, правила кодирования URL являются частью спецификаций URL и URI .
  • Если вместо этого вы отправили аргументы как данные POST, используя "application / x"-www-form-urlencoded "тип контента, правила кодирования немного другие;см. спецификацию HTML .(Основное отличие состоит в том, что эта кодировка кодирует пробелы в виде + символов.)
  • Вы также можете кодировать данные POST другим способом, при условии, что клиент и сервер HTTP понимают кодировку и тип содержимого.

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

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