2009-12-20 1 views
3

Я пытаюсь использовать twitter streaming api. Я мог бы успешно фильтр твитов с помощью завиток, как указано here:twitter streaming api - установить фильтр в http post request (apache httpcomponents)

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

где tracking представляет собой обычный файл с содержанием:

track=Berlin 

Теперь я попытался сделать то же самое в JavaSE, используя апача HTTPComponents:

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); 

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

ответ

3

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

(HTTP) Отправляет указанные данные в запросе POST на сервер HTTP, в таким же образом, что браузер делает, когда пользователь заполнил в HTML форме и нажимает кнопку отправки. Это будет вызывать завихрение для передачи данных на сервер с использованием типа контента application/x-www-form-urlencoded.

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

+0

Благодарим Брайана за вашу быструю помощь, вы правы. Мне нужно rtfm ... – rdoubleui