2011-01-20 67 views
3

試圖從android客戶端調用,使用路標oauth庫。我生成了新的APIv2密鑰,但似乎沒有什麼區別。錯誤我得到的樣子:來自Android的Yelp v2 API使用SignPost oauth libs說簽名無效

{"error":{"text":"Signature was 
invalid","id":"INVALID_SIGNATURE","description":"Invalid signature. 
Expected signature base string: GET&http%3A%2F%2Fapi.yelp.com 
%2Fv2%2Fsearch&category_filter%3Drestaurants%2520food%26limit%3D10%26ll 
%3D37.422005%252C-122.084095%26oauth_consumer_key 
%3DPbSjw9p08To_XXXXXXXXZg%26oauth_nonce 
%3D-81097XXXXXXXX560239%26oauth_signature_method%3DHMAC- 
SHA1%26oauth_timestamp%3D129XXXX091%26oauth_token 
%3DARfbDXXXXXXXXlBHARTgygLkcMw9h8eW%26oauth_version%3D1.0%26offset 
%3D0%26radius_filter%3D300%26sort%3D0"}} 

我仔細檢查了,和我所有的令牌和祕密值完全匹配 什麼在管理API屏幕。代碼目前看起來像這樣:

if (location != null) { 
     String lat = Double.toString(location.getLatitude()); 
     String lng = Double.toString(location.getLongitude()); 
     String category = "restaurants+food"; 
     String radius = "300"; 
     String limit = "10"; 
     String offset = "0"; 
     String sort = "0"; 
     try { 
       String query = String.format("http://api.yelp.com/v2/search?ll=%s, 
%s&category_filter=%s&radius_filter=%s&limit=%s&offset=%s&sort=%s", 
           URLEncoder.encode(lat, ENCODING_SCHEME), 
           URLEncoder.encode(lng, ENCODING_SCHEME), 
           category, 
           URLEncoder.encode(radius, ENCODING_SCHEME), 
           URLEncoder.encode(limit, ENCODING_SCHEME), 
           URLEncoder.encode(offset, ENCODING_SCHEME), 
           URLEncoder.encode(sort, ENCODING_SCHEME)); 
       OAuthConsumer consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, 
CONSUMER_SECRET); 
       consumer.setTokenWithSecret(TOKEN, TOKEN_SECRET); 
       consumer.setMessageSigner(new HmacSha1MessageSigner()); 
       consumer.setSendEmptyTokens(true); 
       consumer.setSigningStrategy(new QueryStringSigningStrategy()); 
       String signedQuery = consumer.sign(query); 
       Log.i(getClass().getName(), signedQuery); 
       HttpGet request = new HttpGet(signedQuery); 
       HttpClient httpClient = new DefaultHttpClient(); 
       HttpResponse response = (HttpResponse) httpClient.execute(request); 
       HttpEntity entity = response.getEntity(); 
       String jsonResult = EntityUtils.toString(entity); 
       Log.i(getClass().getName(), jsonResult); 
+0

嘿,你能解決這個問題嗎?我有同樣的問題 – mgonto 2011-07-08 17:47:35

回答

2

剛剛發現問題。你應該添加MessageSigner BEFORE設置TokenSecret,否則它是空的,並且所有東西都得到嚴重簽名