Java S3RESTAPI获取对象示例
我们正在尝试编写一个集成,通过S3RESTAPI下载PDF。关于使用的文档对我来说有点缺乏。我已经尽了最大努力用JAVA重新创建了这些示例,但没有任何效果,我想知道是否有人知道JAVA或其他语言的示例 我的例子 公共班机{Java S3RESTAPI获取对象示例,java,amazon-web-services,amazon-s3,Java,Amazon Web Services,Amazon S3,我们正在尝试编写一个集成,通过S3RESTAPI下载PDF。关于使用的文档对我来说有点缺乏。我已经尽了最大努力用JAVA重新创建了这些示例,但没有任何效果,我想知道是否有人知道JAVA或其他语言的示例 我的例子 公共班机{ private static final String AWS_S3_REGION_NAME = "us-west-2"; private static final String AWS_S3_SERVICE_NAME = "s3"; private static final
private static final String AWS_S3_REGION_NAME = "us-west-2";
private static final String AWS_S3_SERVICE_NAME = "s3";
private static final String AWS_S3_KEY_ID = "<My Key ID>";
private static final String AWS_S3_KEY_SECRET = "<My secret>";
private static final String BUCKET_NAME = "<My Bucket Name>";
private static final String DOCUMENT_OBJECT_KEY = "MyTest1.txt";
public static void main(String[] args) {
String timeStamp = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z").format(new java.util.Date());
Response response = null;
byte[] signatureKey = null;
try {
signatureKey = getSignatureKey(AWS_S3_KEY_ID, timeStamp, "us-west-2", "s3");
response = getRestFileFromS3(timeStamp, IOUtils.toString(signatureKey, StandardCharsets.UTF_8.displayName()));
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(response.getHeaders());
}
static byte[] HmacSHA256(String data, byte[] key) throws Exception {
String algorithm="HmacSHA256";
Mac mac = Mac.getInstance(algorithm);
mac.init(new SecretKeySpec(key, algorithm));
return mac.doFinal(data.getBytes("UTF8"));
}
static byte[] getSignatureKey(String key, String dateStamp, String regionName, String serviceName) throws Exception {
byte[] kSecret = ("AWS4" + key).getBytes("UTF8");
byte[] kDate = HmacSHA256(dateStamp, kSecret);
byte[] kRegion = HmacSHA256(regionName, kDate);
byte[] kService = HmacSHA256(serviceName, kRegion);
byte[] kSigning = HmacSHA256("aws4_request", kService);
return kSigning;
}
static Response getRestFileFromS3(String date, String signatureKey) {
Client client = ClientBuilder.newClient( new ClientConfig().register( LoggingFilter.class ) );
WebTarget webTarget = client.target("https://s3-us-west-2.amazonaws.com/")
.path(BUCKET_NAME)
.path(DOCUMENT_OBJECT_KEY);
Invocation.Builder invocationBuilder = webTarget
.request(MediaType.APPLICATION_JSON)
.header("Host", BUCKET_NAME+".s3.amazonaws.com")
.header("Date", date)
.header("Authorization", signatureKey);
return invocationBuilder.get();
}
private静态最终字符串AWS\u S3\u REGION\u NAME=“us-west-2”;
专用静态最终字符串AWS\U S3\U服务\U NAME=“S3”;
私有静态最终字符串AWS_S3_KEY_ID=“”;
私有静态最终字符串AWS_S3_KEY_SECRET=“”;
私有静态最终字符串BUCKET_NAME=“”;
私有静态最终字符串文档\u OBJECT\u KEY=“MyTest1.txt”;
公共静态void main(字符串[]args){
String timeStamp=new SimpleDateFormat(“EEE,dd MMM yyy HH:mm:ss z”).format(new java.util.Date());
响应=空;
字节[]signatureKey=null;
试一试{
signatureKey=getSignatureKey(AWS_S3_KEY_ID,时间戳,“us-west-2”,“S3”);
response=getRestFileFromS3(timeStamp,IOUtils.toString(signatureKey,StandardCharsets.UTF_8.displayName());
}捕获(例外e){
e、 printStackTrace();
}
System.out.println(response.getHeaders());
}
静态字节[]HmacSHA256(字符串数据,字节[]键)引发异常{
字符串算法=“HmacSHA256”;
Mac Mac=Mac.getInstance(算法);
init(新的SecretKeySpec(key,algorithm));
返回mac.doFinal(data.getBytes(“UTF8”);
}
静态字节[]getSignatureKey(字符串键、字符串日期戳、字符串regionName、字符串serviceName)引发异常{
字节[]kSecret=(“AWS4”+键).getBytes(“UTF8”);
字节[]kDate=HmacSHA256(日期戳,kSecret);
字节[]kRegion=HmacSHA256(区域名称,kDate);
字节[]kService=HmacSHA256(serviceName,kRegion);
字节[]kSigning=HmacSHA256(“aws4_请求”,kService);
返回kSigning;
}
静态响应getRestFileFromS3(字符串日期、字符串签名键){
Client Client=ClientBuilder.newClient(new ClientConfig().register(LoggingFilter.class));
WebTarget WebTarget=client.target(“https://s3-us-west-2.amazonaws.com/")
.path(BUCKET_名称)
.path(文档\对象\键);
Invocation.Builder invocationBuilder=webTarget
.request(MediaType.APPLICATION_JSON)
.header(“主机”,BUCKET_NAME+“.s3.amazonaws.com”)
.标题(“日期”,日期)
.标题(“授权”,签名键);
返回invocationBuilder.get();
}
}您不使用AWS Java SDK的原因是什么?故事很长,很无聊,但是是的,我们必须尝试在不使用SDK的情况下实现这一点。如果不可能,我可以选择另一条路线。但是,它似乎应该起作用。这样做没有错。我使用所有自己手写的AWS库。我不是一个Java爱好者,但是尽我最大的能力查看您的代码,您似乎跳过了很多。您似乎只是在对签名密钥进行字符串化,并将
授权:
头设置为该值。您必须构造规范化请求并使用该签名密钥来创建签名并连接授权头的各个部分。我看不到所有这些东西@BertAlfred您能告诉我您使用哪个库来创建客户机
并提出请求吗?您不使用AWS Java SDK的任何原因吗?故事很长,很无聊,但是的,我们必须尝试在没有SDK的情况下使其工作。如果不可能,我可以选择另一条路线。但是,它似乎应该起作用。这样做没有错。我使用所有自己手写的AWS库。我不是一个Java爱好者,但是尽我最大的能力查看您的代码,您似乎跳过了很多。您似乎只是在对签名密钥进行字符串化,并将授权:
头设置为该值。您必须构造规范化请求并使用该签名密钥来创建签名并连接授权头的各个部分。我看不到所有这些东西@BertAlfred您能告诉我您使用哪个库来创建客户端
并提出请求吗?