андроид twitter4j oauth не работает когда на 3g - PullRequest
3 голосов
/ 08 февраля 2012

Я создал приложение для Android, используя twitter4j.

Ни один из вызовов API не может аутентифицироваться при использовании 3G, но отлично работает при использовании Wi-Fi. В чем может быть проблема?

1 Ответ

4 голосов
/ 09 марта 2012

Я тщательно протестировал это и могу подтвердить, что это проблема только на устройствах Android 4.0 (ICS). Почему, я еще не уверен, хотя некоторые части HttpURLConnection изменились в 4.0, поэтому некоторые из этих изменений сделали twitter4j несовместимым.

Я думал, что это могло быть так: Android 4.0 ICS, превращающая запросы HttpURLConnection GET в запросы POST

но после анализа запросов с помощью tcpdump кажется, что он действительно делает правильный GET, но по какой-то причине твиттер-интерфейс все еще говорит, что это плохой запрос ..

GET /1/users/show.json?include_entities=true&user_id=6842472 HTTP/1.1
Authorization: OAuth oauth_consumer_key="<redacted>",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1331150787",oauth_nonce="2157367237",oauth_version="1.0",oauth_token="<redacted>",oauth_signature="<redacted>"
Accept-Encoding: gzip
X-Twitter-Client-URL: http://twitter4j.org/en/twitter4j-2.2.5.xml
User-Agent: twitter4j http://twitter4j.org/ /2.2.5  
X-Twitter-Client-Version: 2.2.5
X-Twitter-Client: Twitter4J   
Host: api.twitter.com  
Connection: Keep-Alive


HTTP/1.1 400 Bad Request
Date: Wed, 07 Mar 2012 20:06:30 GMT    
Status: 400 Bad Request   
X-RateLimit-Class: api
X-RateLimit-Reset: 1331153824 
X-Revision: DEV 
Last-Modified: Wed, 07 Mar 2012 20:06:30 GMT  
X-Frame-Options: SAMEORIGIN 
X-Transaction: a0bf805e990a5c79
Content-Type: application/json; charset=utf-8 
X-RateLimit-Remaining: 0 
X-RateLimit-Limit: 150
Pragma: no-cache
Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0
X-Runtime: 0.00742
X-MID: 2295d07237fcb4763f7f54d2bf46e27dd40e022f
Expires: Tue, 31 Mar 1981 05:00:00 GMT
Vary: Accept-Encoding
Server: tfe
Transfer-Encoding: chunked
Connection: close
Content-Encoding: gzip
Set-Cookie: 
...

Если кто-то не может найти, что именно в ICS / HttpURLConnection нарушает этот единственный обходной путь, который я вижу, это написать альтернативный бэкэнд для twitter4j, который использует HttpClient вместо HttpURLConnection, что я и планирую сделать.

РЕДАКТИРОВАТЬ: Итак, я написал клиентский бэкэнд для twitter4j, который использует Apache httpclient, и он страдает от точно такой же проблемы! Еще несколько бессонных часов и Wireshark привели меня к следующему очень удобному решению, которое на самом деле работает:

Инициализируйте ваш экземпляр twitter4j следующим образом:

ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.setOAuthConsumerKey(Const.CONSUMER_KEY);
configurationBuilder.setOAuthConsumerSecret(Const.CONSUMER_SECRET);
configurationBuilder.setUseSSL(true);
Configuration configuration = configurationBuilder.build();
twitter = new TwitterFactory(configuration).getInstance();

setUseSSL (true) - это волшебная строка.

...