如何使用Java和Eclipse为AmazonAPI签署REST请求?

如何使用Java和Eclipse为AmazonAPI签署REST请求?,java,eclipse,api,amazon,Java,Eclipse,Api,Amazon,这是我的困境。我熟悉Java代码的阅读,但不擅长编写。我有几个来自Amazon文档的例子,但我做错了什么。我正在使用Eclipse。我有AWS Java SDK、Apache Commons编解码器和日志以及Base64。在我的项目中,所有代码都位于正确的类路径中 我了解如何形成请求(元素顺序、时间戳等),但不知道如何将此信息发送到java代码以创建签名请求。因此,我将从文档中使用的代码开始 签名代码: import java.security.SignatureException; impor

这是我的困境。我熟悉Java代码的阅读,但不擅长编写。我有几个来自Amazon文档的例子,但我做错了什么。我正在使用Eclipse。我有AWS Java SDK、Apache Commons编解码器和日志以及Base64。在我的项目中,所有代码都位于正确的类路径中

我了解如何形成请求(元素顺序、时间戳等),但不知道如何将此信息发送到java代码以创建签名请求。因此,我将从文档中使用的代码开始

签名代码:

import java.security.SignatureException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

    /**
    * This class defines common routines for generating
    * authentication signatures for AWS requests.
    */
    public class Signature {
        private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";
    /**
    * Computes RFC 2104-compliant HMAC signature.
    * * @param data
    * The data to be signed.
    * @param key
    * The signing key.
    * @return
    * The Base64-encoded RFC 2104-compliant HMAC signature.
    * @throws
    * java.security.SignatureException when signature generation fails
    */
        public static String calculateRFC2104HMAC(String data, String key)
                throws java.security.SignatureException
        {
            String result;
            try {

                // get an hmac_sha1 key from the raw key bytes
                SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM);

                // get an hmac_sha1 Mac instance and initialize with the signing key
                Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
                mac.init(signingKey);

                // compute the hmac on input data bytes
                byte[] rawHmac = mac.doFinal(data.getBytes());

                // base64-encode the hmac
                result = Encoding.EncodeBase64(rawHmac);

            } catch (Exception e) {
                throw new SignatureException("Failed to generate HMAC : " + e.getMessage());
            }
            return result;
        }
}
编码代码:

/**
* This class defines common routines for encoding * data in AWS requests.
*/
public class Encoding {
    /**
    * Performs base64-encoding of input bytes.
    *
    * @param rawData * Array of bytes to be encoded.
    * @return * The base64 encoded string representation of rawData.
    */
    public static String EncodeBase64(byte[] rawData) {
        return Base64.encodeBytes(rawData);
    }
}
我提出的签署请求的代码:

import java.security.SignatureException;

public class SignatureTest {
    /**
     * @param args
     * @throws SignatureException
     */
    public static void main( String[] args ) throws SignatureException {
        // data is the URL parameters and time stamp to be encoded
        String data = "<data-to-encode>";
        // key is the secret key
        String key = "<my-secret-key>";
        Signature.calculateRFC2104HMAC(data, key);
    }
}
导入java.security.SignatureException;
公共类签名测试{
/**
*@param args
*@抛出SignatureException
*/
公共静态void main(字符串[]args)抛出SignatureException{
//数据是要编码的URL参数和时间戳
字符串数据=”;
//钥匙是秘密钥匙
字符串键=”;
签名。计算器C2104HMAC(数据、密钥);
}
}
起初,我得到了与类路径相关的错误,所以我将这些错误添加到我的项目中。现在,当我运行代码时,我没有收到任何错误和响应,我只是返回到命令提示符。我知道这可能是一个简单的解决方案。我花了一周的时间试图弄明白这一点,但没有找到任何答案。有人能给我指出正确的方向吗

注意:由于大小的原因,我没有在这里包含Base64代码,但我的项目中确实包含了它。

我的代码行:

Signature.calculateRFC2104HMAC(data, key);
缺少用于显示结果的打印语句。改成

System.out.println(Signature.calculateRFC2104HMAC(data, key));
给出了我期望的结果。

代码中的行:

Signature.calculateRFC2104HMAC(data, key);
缺少用于显示结果的打印语句。改成

System.out.println(Signature.calculateRFC2104HMAC(data, key));
给了我我期待的结果