пятница, 11 апреля 2014 г.

Используем Apache HttpClient или POST и GET для самых маленьких

Это будет небольшой пост в примерах с минимальным числом комментариев.

Задача: используя httpclient, отправить post - запрос с логином и паролем на некоторый адрес.
Решение: 
HttpClient httpclient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(SESSIONS_URL); //SESSIONS_URL - наш адрес
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair(StaticInformation.LOGIN,
LOGIN));
nameValuePairs.add(new BasicNameValuePair(
StaticInformation.PASSWORD, PASSWORD));
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httpPost, localContext);
int code = response.getStatusLine().getStatusCode(); //code - используем для проверки, прошел ли наш запрос
Пояснение: создаем клиент, создаем запрос, с помощью nameValuePairs забиваем необходимые параметры, делаем запрос, получаем код.

Задача: используя httpclient, отправить пост - запрос с логином и паролем на некоторый адрес при этом сохранить куку для дальнейших post(get) - запросов.
Решение: 
HttpClient httpclient = new DefaultHttpClient();
CookieStore cookieStore = new BasicCookieStore();
HttpContext localContext = new BasicHttpContext();
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
HttpPost httpPost = new HttpPost(StaticInformation.SESSIONS_URL);
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair(StaticInformation.LOGIN,
LOGIN));
nameValuePairs.add(new BasicNameValuePair(
StaticInformation.PASSWORD, PASSWORD));

httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httpPost, localContext);
//делаем запрос номер два
HttpPost httpPostOffer = new HttpPost(StaticInformation.NEW_URL);
httpPostOffer.setEntity(<Сюда запишем новую сущность>);
response = httpclient.execute(httpPostOffer, localContext);
code = response.getStatusLine().getStatusCode();
Пояснение: по-сути то же самое, но тут мы должны создать cookieStore - хранилище для наших кук. Создаем и сразу же делаем привязку к контексту(localContext), после этого можно совершать запросы, передавая туда созданный localContext.

Задача: совершить запрос multipart/form-data. Отправить на сервер картинку, закодированную в Base64. Этим же запросом отослать остальную информацию.
Решение:
httpPostOffer.setEntity(complectEntityToPost(offer));

private MultipartEntity complectEntityToPost(Offer offer) {
MultipartEntity entity = new MultipartEntity(
HttpMultipartMode.BROWSER_COMPATIBLE);
// add data for multiform
for (String asset : offer.getAssets()) {
ByteArrayBody body = new ByteArrayBody(Base64.decode(asset,
Base64.DEFAULT), IMAGE_FORMAT,
Converter.currentDateToString()); //добавим данные как на форме
entity.addPart("offer[assets][]", body);
}
// add other data
for (NameValuePair pair : complectPostValuePairs(offer)) {
try {
entity.addPart(pair.getName(), new StringBody(pair.getValue());
} catch (Exception e) {
e.printStackTrace();
}
}
return entity;
}

private List<NameValuePair> complectPostValuePairs(Offer offer) {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

nameValuePairs
.add(new BasicNameValuePair("offer[organizationId]", "1"));
nameValuePairs.add(new BasicNameValuePair("offer[cityId]", "16"));
               ...................
}
Пояснение: для  multipart/form-data запросов используется MultipartEntity. С помощью ByteArrayBody можно делать обертки вокруг конструкций типа 
Content-Disposition: form-data; name="offer[assets][]"; filename="icon.png",
передавая необходимые параметры в конструктор. Entity, используемая в предыдущих примерах, лишь часть MultipartEntity, поэтому добавлять параметры можно с помощью метода addPart, где первый параметр - имя параметра, второй параметр - его значение.

Задача: сделать так, чтобы при отправке  multipart/form-data - запроса на сервере корректно отображался русскоязычный текст. 
Решение: 
entity.addPart(pair.getName(), new StringBody(pair.getValue(),
Charset.forName("UTF-8")));
Пояснение: при помощи  StringBody "превращаем" каждую строку (в Java строки Unicode) в UTF - 8. Прежде чем, совершать какие - либо действия с кодировкой, присмотритесь к форме. В моем случае, она выглядит вот так: <form accept-charset='UTF-8' action='/offers' enctype='multipart/form-data' id='offer' method='post'>  

Задача: сделать так, чтобы при отправке обычного post - запроса на сервере корректно отображался русскоязычный текст.
Решение: 
new  UrlEncodedFormEntity(complectPostValuePairs(offer),"UTF-8"));
Пояснение: в качестве параметра для списка из NameValuePair подадим название кодировки.

Задача: сделать гет - запрос.
Пояснение: ничем не отличается от поста, используем HttpGet httpGET. Если нужно куки, юзаем точно тот же способ как и в посте.

Не забываем активно использовать "Проверить элемент" в Google Chrome(нас интересует вкладка "Network"). Просматриваем отданную и переданную информацию.






Комментариев нет:

Отправить комментарий