使用 Rest Assured multipart 将文件上传到 S3
Uploading file to S3 using Rest Assured multipart
我正在尝试向 S3 发出 PUT 请求以上传文件。在我目前拥有的放心代码下方,
String putURL = "A lengthy URL that is generated dynmaically";
String fileId = "A random 40 digit key generated by our server";
String cKey = "some key given by amazon";
String cMD5 = "some md5 hash value";
Response r = given().contentType("multipart/mixed").
headers("x-amz-header1",cKey,
"x-amz-header2",cMD5,
"x-amz-header7",accountId,
"x-amz-header6",fileId,
"x-amz-header5","abc",
"x-amz-header4","image/jpeg",
"x-amz-header3","true",
"Content-Type","application/octet-stream").
multiPart(new File("src/test/resources/media/ToBeRemoved.jpg")).
put(putURL);
System.out.println("*********Response code: "+r.getStatusCode());
我总是从服务器收到 400(错误请求)。 我不确定我是否正确使用了分段上传。
但是当我使用像 POSTMAN 这样的任何休息客户端做同样的事情时它工作正常,
PUT <A lengthy URL that is generated dynmaically>
Host: abcd.s3-accelerate.amazonaws.com
x-amz-header1: cKey
x-amz-header2:cMD5
x-amz-header7:accountId
x-amz-header6:fileId
x-amz-header5:abc
x-amz-header4:image/jpeg
x-amz-header3:true
Content-Type:application/octet-stream"
Cache-Control: no-cache
Postman-Token: 687761ef-e059-4a07-eee4-9755931d060a
如果有人可以放心地了解分段上传,那将很有帮助。
我已经检查了以下链接,
编辑 1:
我尝试将上述 POSTMAN 请求转换为 curl 并尝试使用 CURL,即使这样也能正常工作。
所以我放心使用multipart的方式有问题
EDIT2:
原来我用的rest assured没问题,我从S3收到403 Signature mismatch error。尽管它在日志中显示的签名与 AWS 所期望的相同。
经过更多研究,我了解到即使缺少任何 header 参数,也会发送 "Signature Mismatch" 错误。
有迹象表明 REST-assured 不支持 multipart/mixed
正确,例如这个问题:https://github.com/rest-assured/rest-assured/issues/374 - 我知道我组织中的一个团队过去遇到过同样的问题。
如果您愿意评估替代的基于 JVM 的工具,我可以推荐 Karate(免责声明:我是开发者)- 因为它对文件上传有全面的支持,包括 multipart/mixed
.
终于找到了解决办法。
首先,URL 已经编码。所以只好嘱咐RA不要再编码了,
given().urlEncodingEnabled(false). ...
其次,AWS 期望字符集为空。您可以使用下面的代码行指示 RA 执行此操作,
given().
config(RestAssured.config().encoderConfig(EncoderConfig.encoderConfig().appendDefaultContentCharsetToContentTypeIfUndefined(false))).
参考链接:
GitHub issue link 讨论了这个特定问题。
特别感谢我的朋友Saurabh,他帮助我分析问题并指导正确的方向,帮助我在线找到解决方案。
我正在尝试向 S3 发出 PUT 请求以上传文件。在我目前拥有的放心代码下方,
String putURL = "A lengthy URL that is generated dynmaically";
String fileId = "A random 40 digit key generated by our server";
String cKey = "some key given by amazon";
String cMD5 = "some md5 hash value";
Response r = given().contentType("multipart/mixed").
headers("x-amz-header1",cKey,
"x-amz-header2",cMD5,
"x-amz-header7",accountId,
"x-amz-header6",fileId,
"x-amz-header5","abc",
"x-amz-header4","image/jpeg",
"x-amz-header3","true",
"Content-Type","application/octet-stream").
multiPart(new File("src/test/resources/media/ToBeRemoved.jpg")).
put(putURL);
System.out.println("*********Response code: "+r.getStatusCode());
我总是从服务器收到 400(错误请求)。 我不确定我是否正确使用了分段上传。
但是当我使用像 POSTMAN 这样的任何休息客户端做同样的事情时它工作正常,
PUT <A lengthy URL that is generated dynmaically>
Host: abcd.s3-accelerate.amazonaws.com
x-amz-header1: cKey
x-amz-header2:cMD5
x-amz-header7:accountId
x-amz-header6:fileId
x-amz-header5:abc
x-amz-header4:image/jpeg
x-amz-header3:true
Content-Type:application/octet-stream"
Cache-Control: no-cache
Postman-Token: 687761ef-e059-4a07-eee4-9755931d060a
如果有人可以放心地了解分段上传,那将很有帮助。
我已经检查了以下链接,
编辑 1:
我尝试将上述 POSTMAN 请求转换为 curl 并尝试使用 CURL,即使这样也能正常工作。
所以我放心使用multipart的方式有问题
EDIT2:
原来我用的rest assured没问题,我从S3收到403 Signature mismatch error。尽管它在日志中显示的签名与 AWS 所期望的相同。 经过更多研究,我了解到即使缺少任何 header 参数,也会发送 "Signature Mismatch" 错误。
有迹象表明 REST-assured 不支持 multipart/mixed
正确,例如这个问题:https://github.com/rest-assured/rest-assured/issues/374 - 我知道我组织中的一个团队过去遇到过同样的问题。
如果您愿意评估替代的基于 JVM 的工具,我可以推荐 Karate(免责声明:我是开发者)- 因为它对文件上传有全面的支持,包括 multipart/mixed
.
终于找到了解决办法。
首先,URL 已经编码。所以只好嘱咐RA不要再编码了,
given().urlEncodingEnabled(false). ...
其次,AWS 期望字符集为空。您可以使用下面的代码行指示 RA 执行此操作,
given().
config(RestAssured.config().encoderConfig(EncoderConfig.encoderConfig().appendDefaultContentCharsetToContentTypeIfUndefined(false))).
参考链接:
GitHub issue link 讨论了这个特定问题。
特别感谢我的朋友Saurabh,他帮助我分析问题并指导正确的方向,帮助我在线找到解决方案。