api twitter streaming - установить фильтр в запросе HTTP post (apache httpcomponents) - PullRequest
3 голосов
/ 20 декабря 2009

Я пробую твиттер API для потоковой передачи. Я мог бы успешно фильтровать твиты, используя curl, как указано здесь :

curl -d @tracking http://stream.twitter.com/1/statuses/filter.json -u <user>:<pass>

, где tracking - простой файл с содержанием:

track=Berlin

Теперь я попытался сделать то же самое в JavaSE, используя HTTP-компоненты Apache:

    UsernamePasswordCredentials creds = new UsernamePasswordCredentials(<user>, <pass>);
    DefaultHttpClient httpClient = new DefaultHttpClient();
    httpClient.getCredentialsProvider().setCredentials(AuthScope.ANY, creds);
    HttpPost httpPost = new HttpPost("http://stream.twitter.com/1/statuses/filter.json");
    HttpParams params = new BasicHttpParams();

    params = params.setParameter("track", "Berlin");
    httpPost.setParams(params);

    try {
        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity entity = httpResponse.getEntity();
        if (entity != null) {
            InputStream instream = entity.getContent();
            String t;
            BufferedReader br = new BufferedReader(new InputStreamReader(instream));
            while(true) {
                t = br.readLine();
                if(t != null) {                        
                    linkedQueue.offer(t);
                }
            }
        }
    } catch (IOException ioe) {
        System.out.println(ioe.getMessage());
    }
    finally{
        httpClient.getConnectionManager().shutdown();
    }

Когда я запускаю это, я получаю:

No filter parameters found. Expect at least one parameter: follow track

как отдельная запись в моем linkedQueue. Кажется, что API хочет параметр в другой форме, но не может найти никакой подсказки в документации. Может кто-нибудь поделиться опытом с API или увидеть какие-либо другие проблемы с кодом? Спасибо!

EDIT Поместить параметр фильтра в параметры было плохой идеей. Поскольку это почтовые данные, их необходимо определить как Entity перед выполнением запроса:

        StringEntity postEntity = new StringEntity("track=Berlin", "UTF-8");
        postEntity.setContentType("application/x-www-form-urlencoded");
        httpPost.setEntity(postEntity);

Это то, что я делал неправильно. Спасибо, Брайан!

1 Ответ

3 голосов
/ 20 декабря 2009

Я подозреваю, что вам нужно опубликовать данные как содержимое вашего сообщения HTTP. Страница руководства для curl -d говорит:

(HTTP) Отправляет указанные данные в POST-запрос к HTTP-серверу, в так же, как браузер делает, когда пользователь заполнил форму HTML и нажимает кнопку отправки. Это будет заставить curl передавать данные в сервер, использующий тип контента применение / х-WWW-форм-urlencoded.

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

...