使用Rest Assured multipart将文件上载到S3
我正试图向S3发出PUT请求,以便上传一个文件。下面是到目前为止我掌握的最可靠的代码使用Rest Assured multipart将文件上载到S3,multipart,rest-assured,Multipart,Rest Assured,我正试图向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";
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(错误请求)。我不确定是否正确使用了多部分上传
但当我使用任何rest客户机(如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
PUT
EDIT1:
我尝试将上面的邮递员请求转换为curl,并尝试使用curl,甚至效果也不错
因此,我在rest-assured中使用multipart的方式有些错误
EDIT2:
事实证明,我正确地使用了rest-assured,我从S3得到了403个签名不匹配错误。虽然它在日志中显示的签名与AWS预期的相同。
经过进一步研究,我了解到即使缺少任何标头参数,也会发送“签名不匹配”错误。有迹象表明,REST assured不支持正确的多部分/mixed
,例如此问题:-我知道我的组织中有一个团队在过去遇到过相同的问题
如果您愿意评估其他基于JVM的工具,我可以推荐(免责声明:我是开发人员)-因为它全面支持文件上传,包括multipart/mixed
有迹象表明,REST assured不支持multipart/mixed
,例如此问题:-我知道我的组织中有一个团队过去遇到过相同的问题
如果您愿意评估其他基于JVM的工具,我可以推荐(免责声明:我是开发人员)-因为它全面支持文件上传,包括multipart/mixed
最终我找到了解决方案
首先,URL已经编码。所以我必须指示RA不要再对它进行编码
given().urlEncodingEnabled(false). ...
其次,AWS希望字符集为空。您可以使用下面的代码行指示RA执行此操作
given().
config(RestAssured.config().encoderConfig(EncoderConfig.encoderConfig().appendDefaultContentCharsetToContentTypeIfUndefined(false))).
参考链接:
关于这个特殊的问题
特别感谢我的朋友Saurabh,他帮助我分析了这个问题,并指导我正确的方向,帮助我在线找到解决方案。最终我找到了解决方案
首先,URL已经编码。所以我必须指示RA不要再对它进行编码
given().urlEncodingEnabled(false). ...
其次,AWS希望字符集为空。您可以使用下面的代码行指示RA执行此操作
given().
config(RestAssured.config().encoderConfig(EncoderConfig.encoderConfig().appendDefaultContentCharsetToContentTypeIfUndefined(false))).
参考链接:
关于这个特殊的问题
特别感谢我的朋友Saurabh,他帮助我分析了这个问题,并指导我正确的方向,帮助我在线找到解决方案。你能帮我看看我的问题吗