这是最终工作的代码:
生成字符串方法:
static String generateSignature( String method, String base, List<String> sortedItems) { String param = ''; for (int i = 0; i < sortedItems.length; i++) { if (i == 0) param = sortedItems[i]; else param += '&${sortedItems[i]}'; } String sig = '$method&${Uri.enpreComponent(base)}&${Uri.enpreComponent(param)}'; String key = '${Uri.enpreComponent(_secretKey)}&${Uri.enpreComponent(twitter.secret)}'; var digest = Hmac(sha1, utf8.enpre(key)).convert(utf8.enpre(sig)); return base64.enpre(digest.bytes); }Twitter接听电话的便捷方法:
Future<http.Response> _twitterGet( String base, List<List<String>> params) async { if (twitter == null) await _startSession(); String oauthConsumer = 'oauth_consumer_key="${Uri.enpreComponent(_consumerKey)}"'; String oauthToken = 'oauth_token="${Uri.enpreComponent(twitter.token)}"'; String oauthNonce = 'oauth_nonce="${Uri.enpreComponent(randomAlphaNumeric(42))}"'; String oauthVersion = 'oauth_version="${Uri.enpreComponent("1.0")}"'; String oauthTime = 'oauth_timestamp="${(DateTime.now().millisecondsSinceEpoch / 1000).toString()}"'; String oauthMethod = 'oauth_signature_method="${Uri.enpreComponent("HMAC-SHA1")}"'; var oauthList = [ oauthConsumer.replaceAll('"', ""), oauthNonce.replaceAll('"', ""), oauthMethod.replaceAll('"', ""), oauthTime.replaceAll('"', ""), oauthToken.replaceAll('"', ""), oauthVersion.replaceAll('"', "") ]; var paramMap = Map<String, String>(); for (List<String> param in params) { oauthList.add( '${Uri.enpreComponent(param[0])}=${Uri.enpreComponent(param[1])}'); paramMap[param[0]] = param[1]; } oauthList.sort(); String oauthSig = 'oauth_signature="${Uri.enpreComponent(generateSignature("GET", "https://api.twitter.com$base", oauthList))}"'; return await http .get(new Uri.https("api.twitter.com", base, paramMap), headers: { "Authorization": 'Oauth $oauthConsumer, $oauthNonce, $oauthSig, $oauthMethod, $oauthTime, $oauthToken, $oauthVersion', "Content-Type": "application/json" }).timeout(Duration(seconds: 15)); }示例调用:
Future<User> getUser(String tag) async { String base = '/1.1/users/show.json'; final response = await _twitterGet(base, [ ["screen_name", tag], ["tweet_mode", "extended"] ]); if (response.statusCode == 200) { try { return User(json.depre(response.body)); } catch (e) { print(e); return null; } } else { print("Error retrieving user"); print(response.body); return null; } }


