nomurabbitのブログ

nomurabbitのブログはITを中心にした技術ブログです。

nomurabbitのブログ

【AWS】サーバーレスAPIでリダイレクト先にパラメータわたしてみた【サーバーレス】

こんにちは!nomurabbitです。
この記事ではサーバーレスAPI
リダイレクトした先に
パラメータを渡してみたいと思います。

過去の記事の内容を組み合わせて
実装してみます。

nomurabbit.hatenablog.jp
nomurabbit.hatenablog.jp

テンプレートの準備

まず、Lambdaのテンプレートを準備します。

.NET Core3.1のテンプレートは、
この記事この記事を参考にしてください。

ソースコード

今回はパッケージの追加は不要です。

ソースコードのポイントは下記の通りです。

public ApiResponse FunctionHandler(object input, ILambdaContext context)
{
    try
    {
        string redirectUrl = "https://hogehoge.com/redirectparamdst";
        string redirectParam = "?userid=nomurabbit";

        ApiRequest apiRequest         = JsonSerializer.Deserialize<ApiRequest>(input.ToString(), ApiUtil.GetJsonSerializerOptionsDefault());
        ApiRequestBody apiRequestBody = (apiRequest.Body == null) ? new ApiRequestBody() : JsonSerializer.Deserialize<ApiRequestBody>(apiRequest.Body, ApiUtil.GetJsonSerializerOptionsDefault());

        ApiResponse apiResponse                   = new ApiResponse();
        List<ApiResponseBody> apiResponseBodyList = new List<ApiResponseBody>();
        ApiResponseBody apiResponseBody           = new ApiResponseBody();
        Dictionary<string, string> apiResonseHeaders             = new Dictionary<string, string>{{"Access-Control-Allow-Origin", "*"},{"Access-Control-Allow-Headers", "Content-Type"}, {"Access-Control-Allow-Methods", "GET"}, {"Location", redirectUrl + redirectParam}};
        Dictionary<string, string[]> apiResonseMultiValueHeaders = new Dictionary<string, string[]>{{"Set-Cookie", new string[] {"KEY1=VALUE1; SameSite=None", "KEY2=VALUE2; SameSite=None"}}};
        
        apiResponse.IsBase64Encoded   = false;
        apiResponse.StatusCode        = HttpStatusCode.Redirect;
        apiResponse.Headers           = apiResonseHeaders;
        apiResponse.MultiValueHeaders = apiResonseMultiValueHeaders;

        apiResponse.Body = "";

        return apiResponse;
    }
    catch (System.Exception e)
    {
        ApiResponse apiResponse         = new ApiResponse();
        ApiResponseBody apiResponseBody = new ApiResponseBody();
        Dictionary<string, string> apiResonseHeaders             = new Dictionary<string, string>{{"Access-Control-Allow-Origin", "*"},{"Access-Control-Allow-Headers", "Content-Type"}, {"Access-Control-Allow-Methods", "GET"}};
        Dictionary<string, string[]> apiResonseMultiValueHeaders = new Dictionary<string, string[]>{{"Set-Cookie", new string[] {"KEY1=VALUE1; SameSite=None", "KEY2=VALUE2; SameSite=None"}}};
        
        apiResponse.IsBase64Encoded   = false;
        apiResponse.StatusCode        = HttpStatusCode.OK;
        apiResponse.Headers           = apiResonseHeaders;
        apiResponse.MultiValueHeaders = apiResonseMultiValueHeaders;

        apiResponseBody.Message       = e.Message + e.StackTrace;
        apiResponse.Body              = JsonSerializer.Serialize(apiResponseBody);

        return apiResponse;
    }
}

リダイレクトさせるメソッドでは
apiResponse.StatusCode を HttpStatusCode.Redirectにするのに加えて、
レスポンスヘッダーのLocationに
パラメータを追加しています。

public ApiResponse FunctionHandler(object input, ILambdaContext context)
{
    try
    {
        ApiRequest apiRequest         = JsonSerializer.Deserialize<ApiRequest>(input.ToString(), ApiUtil.GetJsonSerializerOptionsDefault());
        ApiRequestBody apiRequestBody = (apiRequest.Body == null) ? new ApiRequestBody() : JsonSerializer.Deserialize<ApiRequestBody>(apiRequest.Body, ApiUtil.GetJsonSerializerOptionsDefault());

        ApiResponse apiResponse                   = new ApiResponse();
        ApiResponseBody apiResponseBody           = new ApiResponseBody();

        string targetParamKey = "userid";

        Dictionary<string, string>.KeyCollection paramKeys = apiRequest.QueryStringParameters.Keys;
        foreach( string paramKey in paramKeys )
        {
            if(paramKey == targetParamKey)
            {
                apiResponseBody.Message = "user id is " + apiRequest.QueryStringParameters[targetParamKey] + ". thank you!";
            }
        }

        Dictionary<string, string> apiResonseHeaders             = new Dictionary<string, string>{{"Access-Control-Allow-Origin", "*"},{"Access-Control-Allow-Headers", "Content-Type"}, {"Access-Control-Allow-Methods", "GET"}, {"Lambda-Result-Code", ApiUtil.RESULT_CODE_SUCCESS}, {"Lambda-Result-Message", ApiUtil.GetResultCodeDictionary()[ApiUtil.RESULT_CODE_SUCCESS]}};
        Dictionary<string, string[]> apiResonseMultiValueHeaders = new Dictionary<string, string[]>{{"Set-Cookie", new string[] {"KEY1=VALUE1; SameSite=None", "KEY2=VALUE2; SameSite=None"}}};

        apiResponse.IsBase64Encoded     = false;
        apiResponse.StatusCode          = HttpStatusCode.OK;
        apiResponse.Headers             = apiResonseHeaders;
        apiResponse.MultiValueHeaders   = apiResonseMultiValueHeaders;
        apiResponse.Body                = JsonSerializer.Serialize(apiResponseBody);

        return apiResponse;
    }
    catch (System.Exception e)
    {
        ApiResponse apiResponse         = new ApiResponse();
        ApiResponseBody apiResponseBody = new ApiResponseBody();
        apiResponseBody.Message = "error" + e.Message + e.StackTrace;

        Dictionary<string, string> apiResonseHeaders             = new Dictionary<string, string>{{"Access-Control-Allow-Origin", "*"},{"Access-Control-Allow-Headers", "Content-Type"}, {"Access-Control-Allow-Methods", "POST"}, {"Lambda-Result-Code", ApiUtil.RESULT_CODE_ERROR}, {"Lambda-Result-Message", e.Message + "::" + e.StackTrace}};
        Dictionary<string, string[]> apiResonseMultiValueHeaders = new Dictionary<string, string[]>{{"Set-Cookie", new string[] {"KEY1=VALUE1; SameSite=None", "KEY2=VALUE2; SameSite=None"}}};
        
        apiResponse.IsBase64Encoded     = false;
        apiResponse.StatusCode          = HttpStatusCode.OK;
        apiResponse.Headers             = apiResonseHeaders;
        apiResponse.MultiValueHeaders   = apiResonseMultiValueHeaders;
        apiResponse.Body                = JsonSerializer.Serialize(apiResponseBody);

        return apiResponse;
    }
}

リダイレクトを受けるメソッドでは
apiRequest.QueryStringParametersから、
パラメータを取得しています。

GitHubソースコードを載せていますので、
よければ参考にしてください。

リダイレクトさせるメソッド
github.com

リダイレクトを受けるメソッド
github.com

以上でリダイレクト先に
パラメータを渡すことができました。

よかったら試してみてください。
では!