Включение заголовка Access-control в лямбда-функцию AWS в Java - PullRequest
0 голосов
/ 24 февраля 2019

Я пытался развернуть лямбда-функцию, а затем сделать ее доступной через API-шлюз.Моя java-функция находится в JAVA, и это документация, которой я руководствовался при создании простой лямбда-функции AWS в JAVA:

https://docs.aws.amazon.com/lambda/latest/dg/java-handler-io-type-pojo.html

Вот так выглядит мой обработчик функций:

package lambda;

    import com.amazonaws.services.lambda.runtime.Context;
    import com.amazonaws.services.lambda.runtime.RequestHandler;
    import lambda.axon.Path;

    public class shortestPath implements RequestHandler<RequestClass, ResponseClass>{

        public ResponseClass handleRequest(RequestClass request, Context context){
            String inputString = request.inputString;
            int steps = Path.stepsTo(inputString);
            return new ResponseClass(steps);

        }
    }

Вот этот класс запросов:

package lambda;

public class RequestClass {
    String inputString;

    public String getInputString() {
        return inputString;
    }

    public void setInputString(String inputString) {
        this.inputString = inputString;
    }


    public RequestClass(String inputString) {
        this.inputString = inputString;
    }

    public RequestClass() {
    }
}

И вот этот класс ответов:

package lambda;

public class ResponseClass {
    int steps;

    public ResponseClass(int steps) {
        this.steps = steps;
    }

    public ResponseClass() {
    }
    public int getSteps() {
        return steps;
    }

    public void setSteps(int steps) {
        this.steps = steps;
    }


}

Я развертываю это на aws и настраиваю шлюз API AWS для его запуска, всеработает нормально, когда я достигаю конечной точки, заданной шлюзом API, когда я использую почтальон (https://www.getpostman.com/)

Но попытка того же через браузер выдает ошибку CORS:

Access to XMLHttpRequest at 'https://<hash>execute-api.us-east-1.amazonaws.com/dev' from origin 'http://localhost:4200' has been blocked by CORS policy: Request header field access-control-allow-origin is not allowed by Access-Control-Allow-Headers in preflight response.

Я попытался включить CORS в консоли шлюза API и затем повторно развернуть его: enter image description here

Этот пост Stackoverflow ( Настроить заголовки ответов CORS на AWS Lambda? ) говорит, что если я использую лямбда-прокси, у меня должны быть заголовки в самом ответе обработчика, я не уверен, что такое прокси, но как я могу это сделать с моей текущей реализацией функции Lambda, то есть включить пользовательские заголовки в свой ответ

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Чтобы включить cors для конечной точки шлюза API, которая подключается к лямбда-функции, вы должны включить cors для конечной точки API (вы это сделали) И настроить лямбда-функцию suport cors.

Следуйте моему примеру:

// new respose class, replace for your class - ResponseClass
public class Response {

    private int statusCode; // http status code

    private Map<String, String> headers; // headers

    private String body; // body - what you want to return to client

    public Response(int statusCode, Map<String, String> headers, String body) {
        this.statusCode = statusCode;
        this.headers = headers;
        this.body = body;
    }

    public int getStatusCode() {
        return statusCode;
    }

    public Map<String, String> getHeaders() {
        return headers;
    }

    public String getBody() {
        return body;
    }

    public void setStatusCode(int statusCode) {
        this.statusCode = statusCode;
    }

    public void setHeaders(Map<String, String> headers) {
        this.headers = headers;
    }

    public void setBody(String body) {
        this.body = body;
    }

}

/// -------------

package lambda;

    import com.amazonaws.services.lambda.runtime.Context;
    import com.amazonaws.services.lambda.runtime.RequestHandler;
    import lambda.axon.Path;

    public class shortestPath implements RequestHandler<RequestClass, Response>{

        public Response handleRequest(RequestClass request, Context context){
            String inputString = request.inputString;
            int steps = Path.stepsTo(inputString);

            Map<String, String> headers = new HashMap<>();
            headers.put(Access-Control-Allow-Origin, "*"); // cors header, you can add another header fields

            return new Response(200, headers, "" + steps);
            // return new Response(200, headers, "{result: " + steps + "}");
            // simple json response. ex: {result: '3433"}
        }
    }

Мой эффект действует только при использовании API-шлюза LAMBDA-PROXY Event Config (по умолчанию)

enter image description here

0 голосов
/ 25 февраля 2019

вы можете включить cors из шлюза api, вы можете управлять cors из лямбды и управлять заголовками из lambda.

я бы предложил включить cors из шлюза api и проверить, будет ли он работать.

вы можете управлять access-control-origin и headers таким образом

'use strict';

module.exports.hello = function(event, context, callback) {

const response = {
  statusCode: 200,
  headers: {
    "Access-Control-Allow-Origin" : "*", // Required for CORS support to work
    "Access-Control-Allow-Credentials" : true // Required for cookies, authorization headers with HTTPS 
  },
  body: JSON.stringify({ "message": "Hello World!" })
};

callback(null, response);
};

вы можете обратиться к этой документации: https://serverless.com/framework/docs/providers/aws/events/apigateway/

...