首页 > 解决方案 > 无法通过 API Gateway 使用 POST 方法发送 JSON 数据

问题描述

我需要通过集成了 lambda 的 AWS API Gateway 访问私有 API。所以我使用DefaultRequest对象和 AWS4Signer 来签署 http 请求并点击私有 API url。

虽然,我能够点击 URL,但无法发送 JSON 数据,但在 handleRequest() 中的接收 lambda 上,我得到一个空的 JSON {}。下面是我正在使用的代码。

private static void doAswSigFour(String url, DefaultRequest<Void> request) {
        AWS4Signer signer = new AWS4Signer();
        signer.setRegionName(US_EAST_ONE);
        signer.setServiceName(EXECUTE_API);
        signer.setEndpointPrefix(url);
        String accessKeyID = System.getenv(AWS_ACCESS_KEY_ID);
        String secretKey = System.getenv(AWS_SECRET_ACCESS_KEY);
        String sessionKey = System.getenv(AWS_SESSION_TOKEN);
        BasicSessionCredentials basicSessionCredentials = new BasicSessionCredentials(accessKeyID, secretKey, sessionKey);
        signer.sign(request, basicSessionCredentials);
    }
    
private static DefaultRequest<Void> createAPIGWGetRequest(String finalUrl, String jsonString) {
        DefaultRequest<Void> request = new DefaultRequest<Void>(EXECUTE_API);
        request.addHeader(CONTENT_TYPE, APPLICATION_SLASH_JSON);
        request.setEndpoint(URI.create(finalUrl));
        request.setHttpMethod(HttpMethodName.POST);
        request.setContent(new ByteArrayInputStream(jsonString.getBytes()));
        return request;
    } 

在上面的代码中,jsonString 是我在字符串中的实际 JSON。我不确定是否有其他方式来发送数据。

编辑 1:添加调用功能代码

private static String invokeAPI(int trackerStatusAPIMaxWaitTime, DefaultRequest<Void> request) throws JsonProcessingException {
        ClientConfiguration clientConfiguration = new ClientConfiguration();
        clientConfiguration.setRequestTimeout(trackerStatusAPIMaxWaitTime);
        clientConfiguration.setSocketTimeout(trackerStatusAPIMaxWaitTime);
        clientConfiguration.setConnectionTimeout(trackerStatusAPIMaxWaitTime);
        Response<AmazonWebServiceResponse<String>> response = new AmazonHttpClient(clientConfiguration)
                .requestExecutionBuilder().request(request).errorResponseHandler(new ErrorResponseHandler())
                .execute(new StringResponseHandler());
        return response.getAwsResponse().getResult();
    }

标签: amazon-web-servicespostaws-lambdaaws-api-gateway

解决方案


推荐阅读