2015-10-23 2 views
0

Я пытаюсь сделать запрос к API Yelp. Однако я все время получаю этот результатЦелевой хост не должен быть пустым Запрос JSON

{"error": {"text": "Signature was invalid", "id": "INVALID_SIGNATURE", "description": "Invalid signature. Expected signature base string: GET\u0026https%3A%2F%2Fapi.yelp.com%2Fv2%2Fsearch\u0026category_filter%3DAmerican%26cc%3DAUll%253D-37.81107631570312%252C144.96785815805197%26limit%3D10%26oauth_consumer_key%3DyiuyLqUyFVE_-0tOCUkPhw%26oauth_nonce%3Db4f1509d-39ef-4206-8620-1d3dd278c842%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1445592027%26oauth_token%3DkrEbYb38zOb6Id9shO9bOMjBWuGhBnWz%26radius_filter%3D2000%26sort%3D1%26term%3DAmerican"}} 

Это мой код для генерации запроса и самой Oauth-подписи.

private static String hmacSha1(String value, String key) 
     throws UnsupportedEncodingException, NoSuchAlgorithmException, 
     InvalidKeyException { 
    String type = "HmacSHA1"; 
    SecretKeySpec secret = new SecretKeySpec(key.getBytes(), type); 
    Mac mac = Mac.getInstance(type); 
    mac.init(secret); 
    byte[] bytes = mac.doFinal(value.getBytes()); 
    return bytesToHex(bytes); 
} 

private final static char[] hexArray = "abcdef".toCharArray(); 

private static String bytesToHex(byte[] bytes) { 
    char[] hexChars = new char[bytes.length * 2]; 
    int v; 
    for (int j = 0; j < bytes.length; j++) { 
     v = bytes[j] & 0xFF; 
     hexChars[j * 2] = hexArray[v >>> 4]; 
     hexChars[j * 2 + 1] = hexArray[v & 0x0F]; 
    } 
    return new String(hexChars); 
} 

Моя подпись запроса, что я вход в метод hmacsha1 следующим

String nonsense = UUID.randomUUID().toString(); 
    Long authSeconds = System.currentTimeMillis()/1000; 
    String req = "https://api.yelp.com/v2/search?"+ 
      "&category_filter=" + chosen+ 
      "&cc=AU"+ 
      "ll=" + x + "," + y+ 
      "&limit=10"+ 
      "&oauth_consumer_key=" + YELP_CONSUMER_KEY+ 
      "&oauth_nonce="+nonsense+ 
      "&oauth_signature_method=HMAC-SHA1"+ 
      "&oauth_timestamp="+authSeconds+ 
      "&oauth_token="+YELP_TOKEN+ 
      "&radius_filter=2000"+ 
      "&sort=1"+ 
      "&term=" + chosen; 
    String final_req = null; 
    try{ 
     String signature = hmacSha1(URLEncoder.encode(req), YELP_TOKEN_SECRET); 
     String arg = "&oauth_signature="; 
     final_req = URLEncoder.encode(req+arg+signature); 
    }catch(Exception e){ 
     Log.d("YELPEXCEPTION",e.toString()); 
    } 
    new GetPlacesJSONFeed().execute(final_req); 

Мой вопрос, как я могу это исправить? Нужно ли мне помещать GET \ где-нибудь в строку, которая передается? Кроме того, я следил за форматом, который был указан в ошибке, поэтому моя строка должна пройти. Надеюсь, я смогу помочь в этом.

EDIT. Я разместил URL-адрес кодера вокруг моей строки запроса и ему удалось отправить его. Тем не менее, я получаю это сообщение

Целевой хост не должен быть нулевым или задан в параметрах. схема = нуль, хост = нуль, путь = https://api.yelp.com/v2/search?&category_filter=American&cc=AUll=-37.80499706070189,144.9538392573595&limit=10&oauth_consumer_key=yiuyLqUyFVE_-0tOCUkPhw&oauth_nonce=37230bd9-2b3b-4c2d-8d46-39c9c42da743&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1445594839&oauth_token=krEbYb38zOb6Id9shO9bOMjBWuGhBnWz&radius_filter=2000&sort=1&term=American&oauth_signature=36ab3eb5be7cec26c3dacb24cf7906b9426f589a

ответ

0

попробовать без URLEncoder.encode

String nonsense = UUID.randomUUID().toString(); 
    Long authSeconds = System.currentTimeMillis()/1000; 
    String req = "https://api.yelp.com/v2/search?"+ 
      "&category_filter=" + chosen+ 
      "&cc=AU"+ 
      "ll=" + x + "," + y+ 
      "&limit=10"+ 
      "&oauth_consumer_key=" + YELP_CONSUMER_KEY+ 
      "&oauth_nonce="+nonsense+ 
      "&oauth_signature_method=HMAC-SHA1"+ 
      "&oauth_timestamp="+authSeconds+ 
      "&oauth_token="+YELP_TOKEN+ 
      "&radius_filter=2000"+ 
      "&sort=1"+ 
      "&term=" + chosen; 
    String final_req = null; 
    try{ 
     String signature = hmacSha1(req, YELP_TOKEN_SECRET); 
     String arg = "&oauth_signature="; 
     final_req = req+arg+signature; 
    }catch(Exception e){ 
     Log.d("YELPEXCEPTION",e.toString()); 
    } 
    new GetPlacesJSONFeed().execute(final_req); 
+0

без URL кодирования я получаю это: { "ошибка": { "текст": «Подпись была invalid "," id ":" INVALID_SIGNATURE "," description ":" Недопустимая подпись. Ожидаемая базовая строка подписи: GET \ u0026https% 3A% 2F% 2Fapi.yelp.com% 2Fv2% 2Fsearch \ u0026category_filter% 3DAmerican% 26cc% 3DAUll% 253d-+37,81221290867261% 252C144.955616556108% 26limit% 3D10% 26oauth_consumer_key% 3DyiuyLqUyFVE_-0tOCUkPhw% 26oauth_nonce% 3D6ba3c3c5-906d-4fff-ab6a-3effe7ac4d58% 26oauth_signature_method% 3DHMAC-SHA1% 26oauth_timestamp% 3D1445605461% 26oauth_token% 3DkrEbYb38zOb6Id9shO9bOMjBWuGhBnWz% 26radius_filter% 3D20 00% 26sort% 3D1% 26term% 3DAmerican "}} – JianYA

+0

Могу ли я узнать, правильно ли это передать запрос или какие-либо другие методы? Строка моего запроса отформатирована так же, как и сообщение об ошибке. – JianYA

+0

Я не знаю, как правильно, потому что я не использовал YELP API. Но я думаю, что UrlEncode испортил ваш url, и YELP API не идентифицирует ваш запрос и ключи. – hasanchuk

Смежные вопросы