Last active
August 29, 2015 14:21
-
-
Save fivesmallq/9482ca783578f1356243 to your computer and use it in GitHub Desktop.
NovaData API signature demo
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.novacloud.data; | |
import org.apache.commons.codec.binary.Base64; | |
import javax.crypto.Mac; | |
import javax.crypto.spec.SecretKeySpec; | |
import java.io.UnsupportedEncodingException; | |
import java.net.URLEncoder; | |
import java.security.InvalidKeyException; | |
import java.security.NoSuchAlgorithmException; | |
import java.util.Arrays; | |
import java.util.HashMap; | |
import java.util.Map; | |
/** | |
* NovaData API signature demo. | |
* 代码参考 https://github.com/fit2cloud/qingcloud-api-java-wrapper/blob/master/src/main/java/com/fit2cloud/qingcloud/wsclient/QingCloudWSClient.java | |
*/ | |
public class App { | |
private static final String ENCODING = "UTF-8"; | |
private static String accessKeyId="NOVADATAACCESSKEYIDEXAMPLE"; | |
private static String secretKey="SECRETACCESSKEY"; | |
public static void main(String[] args) throws UnsupportedEncodingException { | |
String method = "GET"; | |
Map<String, String> params = new HashMap<String, String>(); | |
params.put("access_key_id", accessKeyId); | |
params.put("fields", "data.*"); | |
params.put("limit", "2"); | |
params.put("offset", "10"); | |
params.put("signature_version", "1"); | |
params.put("sort", "price:desc"); | |
String signature=computeSignature(method, params); | |
System.out.println(signature); | |
System.out.println(percentEncode(signature)); | |
} | |
public static String computeSignature(String httpMethod, | |
Map<String, String> parameters) { | |
String[] sortedKeys = parameters.keySet().toArray(new String[]{}); | |
Arrays.sort(sortedKeys); | |
final String SEPARATOR = "&"; | |
StringBuilder sbStringToSign = new StringBuilder(); | |
sbStringToSign.append(String.format("%s\n/v1/data/websites/1\n", httpMethod)); | |
String signature = ""; | |
try { | |
int count = 0; | |
for (String key : sortedKeys) { | |
if (count != 0) { | |
sbStringToSign.append(SEPARATOR); | |
} | |
sbStringToSign.append(percentEncode(key)).append("=") | |
.append(percentEncode(parameters.get(key))); | |
count++; | |
} | |
String strToSign = sbStringToSign.toString(); | |
signature = calculateSignature(secretKey, strToSign); | |
} catch (UnsupportedEncodingException e) { | |
} catch (Exception e) { | |
} | |
return signature; | |
} | |
private static String calculateSignature(String key, String stringToSign) { | |
final String ALGORITHM = "HmacSHA256"; | |
byte[] signData = null; | |
try { | |
Mac mac = Mac.getInstance(ALGORITHM); | |
mac.init(new SecretKeySpec(key.getBytes(ENCODING), ALGORITHM)); | |
signData = mac.doFinal(stringToSign.getBytes(ENCODING)); | |
} catch (InvalidKeyException e) { | |
} catch (NoSuchAlgorithmException e) { | |
} catch (UnsupportedEncodingException e) { | |
} catch (IllegalStateException e) { | |
} | |
return new String(Base64.encodeBase64(signData)); | |
} | |
private static String percentEncode(String value) | |
throws UnsupportedEncodingException { | |
return value != null ? URLEncoder.encode(value, ENCODING) | |
.replace("+", "%20").replace("*", "%2A").replace("%7E", "~") | |
: null; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment