2010-11-09 35 views
2

下面是一些尝试使用带有空格的轨道(“您将会”)连接到Twitter的代码。它或多或少以tweetstream4j的方式使用Apache HttpClientsignpost oauth。我用使用Apache HttpClient和Oauth路标连接到带有空格轨道的Twitter流媒体API?

  • 路标 - 核心1.2.1.1.jar
  • 路标,commonshttp4-1.2.1.1.jar
  • 的HttpClient-4.0.1.jar
  • 的HttpCore-4.0.1.jar

如果我运行代码,我会从Twitter获得“401未经授权”。如果使用不带空格的轨迹(例如,“will”而不是“you will”),它会连接并正常工作(只要我填写oauth消费者密钥和秘密,令牌和具有有效值的令牌秘密)。

有没有人发现问题?我认为它与POST正文中的tracks参数的URL编码有关,但我不确定。我一直在挖掘路标如何工作,直到我的眼睛流血。

(这与Twitter streaming API in Java with tracks that have spaces?有关)。

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.List; 
import java.util.logging.Logger; 

import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer; 
import oauth.signpost.exception.OAuthCommunicationException; 
import oauth.signpost.exception.OAuthExpectationFailedException; 
import oauth.signpost.exception.OAuthMessageSignerException; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.client.methods.HttpRequestBase; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 
import org.apache.http.protocol.HTTP; 

public class TwitterSpaceTest { 
private static Logger logger = Logger.getLogger(
    TwitterSpaceTest.class.getName()); 

private static final String API_PROTOCOL = "http"; 
private static final String API_DOMAIN = "stream.twitter.com"; 
private static final String API_URL = "1/"; 
private static final String FILTER_URL = API_URL + "statuses/filter.json"; 

public static void readFrom(HttpRequestBase requestMethod) throws IOException { 
    DefaultHttpClient client = new DefaultHttpClient(); 
    HttpResponse response = client.execute(requestMethod); 
    HttpEntity entity = response.getEntity(); 
    if (entity == null) throw new IOException("No entity"); 
    BufferedReader br = new BufferedReader(new InputStreamReader(
     entity.getContent(), "UTF-8")); 
    while (true) { 
     String line = br.readLine(); 
     if (line != null && !line.isEmpty()) { 
     System.out.println(line); 
     } 
    } 
} 

public static HttpRequestBase getConnection() 
    throws OAuthMessageSignerException, 
    OAuthExpectationFailedException, OAuthCommunicationException, 
    IllegalStateException, IOException { 
    String base = FILTER_URL; 
    List<NameValuePair> params = new ArrayList<NameValuePair>(); 
    // No spaces 
//  params.add(new BasicNameValuePair("track", "will")); 
    // Spaces 
    params.add(new BasicNameValuePair("track", "you will")); 

    HttpPost method = new HttpPost(API_PROTOCOL + "://" + API_DOMAIN + "/" 
     + base); 
    logger.info("" + method.getURI()); 

    UrlEncodedFormEntity postEntity = new UrlEncodedFormEntity(params, 
     HTTP.UTF_8); 
    method.setEntity(postEntity); 

    String consumerKey = "..."; 
    String consumerSecret = "..." 
    CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(
     consumerKey, consumerSecret); 
    String token = "..."; 
    String tokenSecret = "..."; 
    consumer.setTokenWithSecret(token, tokenSecret); 
    consumer.sign(method); 

    return method; 
} 

public static void main(String[] args) throws Exception { 
    readFrom(getConnection()); 
} 
} 

回答