POST-запрос к Хабру в Android?

Как сделать POST-запрос к Хабру с параметрами на Android'e? Даже не столько на андроиде, сколько с помощью Java.

Пытаюсь реализовать запрос на добавление в избранное поста или вопроса. Проследил как происходит подобный запрос в браузере — с помощью jQuery.post() с параметрами:
$.post({
    url: '/json/favorite',
    data: {tt: target_type, ti: target_id, action: action}, 
    function(json){
        // Обработка результата
    },
    'json'
});



Пытаюсь передавать подобный запрос двумя способами: с помощью Jsoup и средствами Apache (пакет org.apache.http.client).

Jsoup:

Connection.Response response = Jsoup.connect("http://habrahabr.ru/json/favorites/")
                    .header("Content-Type","application/x-www-form-urlencoded;charset=UTF-8")
                    .ignoreContentType(true)
                    .cookie(User.PHPSESSION_ID, cookie1)
                    .cookie(User.HSEC_ID, cookie2)
                    .data("tt", targetType)
                    .data("ti", Integer.toString(targetId))
                    .data("action", "add")
                    .method(Connection.Method.POST)
                    .execute();

Log.i(Utils.TAG_MINE, "Response: " + response.parse().text());


Через Apache:

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://habrahabr.ru/json/favorites/");
httppost.setHeader("Content-type", "application/x-www-form-urlencoded");
httppost.setHeader("Accept", "application/json");
httppost.addHeader("Cookie", " PHPSESSID=" + cookie1 + "; hsec_id=" + cookie2);

List<NameValuePair> params = new ArrayList<NameValuePair>(3);
params.add(new BasicNameValuePair("tt", targetType));
params.add(new BasicNameValuePair("ti", Integer.toString(targetId)));
params.add(new BasicNameValuePair("action", "add"));

httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();

// Обработка ответа



В обоих случаях возвращается один и тот же результат:

{&quot;system_errors&quot;:[[&quot;Действие не определено&quot;],&quot;Объект указан неверно&quot;,&quot;Тип объекта указан неверно&quot;]}



, что означает что параметры tt, ti, action не были переданы или обработаны. Такой же результат можно получить если отправить из консоли в браузере запрос:

$.post('/json/favorites/', {}, function(json){console.log(json)})



Но параметры ведь должны передаваться обоими методами без проблем. Для тестирования я даже запустил локальный сервер, написал на нем метод с параметрами и обращался к этому методу как из браузера, так и с девайса — в обоих случаях параметры передавались нормально.

Пробовал экспериментировать с хедерами и посылал те же, что из посылаются через браузер при нормальном запросе — результата нет.

Не понимаю куда копать дальше.
  • Вопрос задан
  • 12244 просмотра
Решения вопроса 1
Allesad
@Allesad Автор вопроса
Ура, нашел в чем проблема — действительно в хедерах. Добавил хедер Referer и все заработало правильно. Видать, на хабре стоит валидация источника запроса.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
EnterSandman
@EnterSandman
Эникей
POST /json/favorites/ HTTP/1.1
Host: habrahabr.ru
Connection: keep-alive
Content-Length: 25
Accept: application/json, text/javascript, */*; q=0.01
Origin: habrahabr.ru
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: habrahabr.ru/qa/41576/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: PHPSESSID=fffraae8d5; hsec_id=4fffcbdbdebe539a313368f36e6; hl_flow=posts; __utma=164318880.1913179960.1370773129.1370773129.1370784648.2; __utmb=164318880.8.10.1370784648; __utmc=164318880; __utmz=164318880.1370773129.1.1.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); _ym_visorc=b

tt=16&ti=41576&action=add

посмотрите каких заголовков не хватает для полного счастья
например X-Requested-With: XMLHttpRequest
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы