dfrankow
dfrankow

Reputation: 21387

Connecting to Twitter streaming API with tracks with spaces using Apache HttpClient and signpost for Oauth?

Below is some code that tries to connect to Twitter using tracks with a space ("you will"). It uses Apache HttpClient and signpost oauth in more or less the manner tweetstream4j does. I use

If I run the code, I get "401 unauthorized" from Twitter. If use tracks without spaces (e.g., "will" instead of "you will"), it connects and works fine (as long as I fill in oauth consumer key and secret, token, and token secret with valid values).

Does anyone spot the problem? I think it has to do with the URL encoding of the tracks parameter in the POST body, but I'm not sure. I've been digging into how signpost works until my eyes bleed.

(This is related to 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());
}
}

Upvotes: 2

Views: 2784

Answers (1)

LiekTheWayuMove
LiekTheWayuMove

Reputation: 33

you should change the http to https in api link

Upvotes: 1

Related Questions