【发布时间】:2019-10-21 14:26:52
【问题描述】:
我正在尝试通过rest-assured 调用托管在aws api gateway 中的get api
我可以签署请求并拨打电话。但是要签署请求,我需要将完整的 url 传递给 AWS 以生成 Authorization Header。
例如。如果我要访问一个端点
https://my-aws-api.com/basepath/v1/request/123
我需要通过需要完整端点的 AWSSigner 签署请求。
我目前的做法
String baseURI="https://my-aws-api.com";
String basePath="basepath/v1";
String requestPath="request/123";
String endpoint=baseURI+"/"+basePath+"/"+requestPath;
Map<String,String> signedHeaders= aws4sign(endpoint,defaultHeaders);
given()
.log().ifValidationFails()
.headers(signedHeaders)
.when()
.get(endpoint)
.then()
.log().ifValidationFails()
.statusCode(200);
如果我这样做,那么我不能使用 RestAssured 的 baseURI、basePath 和 path params
我想像这样访问它
RestAssured.baseURI="https://my-aws-api.com";
RestAssured.basePath="basepath/v1";
given()
.log().ifValidationFails()
.pathParam("reqID", "123")
.when()
.get("request/{reqID}")
.then()
.log().ifValidationFails()
.statusCode(200);
AwsSigner
public static Map<String, String> aws4Sign(String endpoint, Map<String, String> headers) throws URISyntaxException {
String serviceName = "execute-api";
AWS4Signer aws4Signer = new AWS4Signer();
aws4Signer.setRegionName(EU_WEST_1.getName());
aws4Signer.setServiceName(serviceName);
DefaultRequest defaultRequest = new DefaultRequest(serviceName);
URI uri = new URI(endpoint);
defaultRequest.setEndpoint(new URI(uri.getScheme(), null, uri.getHost(), uri.getPort(), "", "", ""));
defaultRequest.setHttpMethod(HttpMethodName.GET);
defaultRequest.setResourcePath(uri.getRawPath());
defaultRequest.setHeaders(headers);
aws4Signer.sign(defaultRequest, DefaultAWSCredentialsProviderChain.getInstance().getCredentials());
return defaultRequest.getHeaders();
}
所以我的问题是有什么办法,我可以在 RestAssured 进行调用之前拦截它的请求,这样我就可以获得完全生成的端点并将 aws 签名的标头添加到调用中。
【问题讨论】:
-
您找到解决方案了吗?
标签: java amazon-web-services aws-sdk rest-assured