使用Rest Assured multipart将文件上载到S3

时间:2017-07-17 19:06:21

标签: multipart rest-assured

我正在尝试向S3发送PUT请求以上传文件。在我目前为止的Rest Assured代码下面,

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

如果有人能在放心的多部分上传中发挥作用,那将会很有帮助。

我已经查看了以下链接,

EDIT1:

我尝试将上面的POSTMAN请求转换为curl并尝试使用CURL,甚至可以正常工作。

所以我在使用multipart方式时会出现问题。

EDIT2:

事实证明我正确地使用了放心,我从S3获得了403签名不匹配错误。虽然它在日志中显示的签名与AWS所期望的相同。 经过一番研究后,我了解即使缺少任何标头参数,也会发送“Signature Mismatch”错误。

2 个答案:

答案 0 :(得分:2)

最后我找到了解决方案。

首先,URL已经编码。所以我不得不指示RA不再对其进行编码,

given().urlEncodingEnabled(false). ...

其次,AWS期望charset为空。您可以使用下面的代码行指示RA执行此操作,

given().
 config(RestAssured.config().encoderConfig(EncoderConfig.encoderConfig().appendDefaultContentCharsetToContentTypeIfUndefined(false))).

参考链接:

GitHub issue link谈论这个特殊问题。

特别感谢我的朋友Saurabh帮助我分析问题并指导正确的方向帮助我找到解决方案。

答案 1 :(得分:1)

有迹象表明,REST保证不会正确支持multipart/mixed,例如此问题:https://github.com/rest-assured/rest-assured/issues/374 - 我知道我的组织中有一个团队过去遇到了同样的问题。

如果您愿意评估其他基于JVM的工具,我可以推荐Karate(免责声明:我是开发人员) - 因为它全面支持文件上传,包括multipart/mixed