Pertanyaan Cara menghasilkan Options (CORS) dengan Swagger


Untuk proyek yang sedang kami kerjakan, kami menghasilkan File Swagger secara otomatis. Namun saat ini kami sedang berjuang dengan bagian CORS.

Kami menggunakan fungsi impor api API API Amazon. Untuk menggunakan ini dalam kombinasi dengan Swagger dan CORS, kita harus membuat tindakan tambahan (operasi) dalam kode sumber kami yang memungkinkan CORS (opsi) untuk setiap metode api (operasi)! misalnya:

    [HttpOptions]
    [Route("{id}")]
    [ProducesResponseType((int)HttpStatusCode.OK)]
    public IActionResult UserOptions()
    {
        return new OkResult();
    }

Seperti yang Anda lihat ini membuat kode menjadi lebih kotor. ini adalah perbaikan sementara, tetapi kami tidak dapat menemukan cara lain. Apakah ada cara untuk menghasilkan ini dalam file definisi angkuh secara otomatis? Atau bagaimana kita bisa melakukan ini, Amazon API gateway diperlukan ini (dokumentasi: http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html)


5
2017-07-24 13:00


asal


Jawaban:


Anda dapat mendorong gerbang api melalui x-amazon-apigateway-integrasi ekstensi angkuh.

Menggunakan Swashbuckle filter dokumen, Anda dapat menghasilkan operasi opsi pada semua jalur Anda tanpa tindakan yang sesuai di pengontrol Anda.

Berikut ini contoh kode yang akan menghasilkan operasi opsi untuk semua jalur dalam kesombongan Anda dan menambahkan ekstensi swagger untuk menghasilkan tiruan di gerbang api pada metode OPTION ini:

    public class AddCorsApiGatewayDocumentFilter : IDocumentFilter
    {
        private Operation BuildCorsOptionOperation()
        {
            var response = new Response
            {
                Description = "Successful operation",
                Headers = new Dictionary<string, Header>
                {
                    { "Access-Control-Allow-Origin", new Header(){Type="string",Description="URI that may access the resource" } },
                    { "Access-Control-Allow-Methods", new Header(){Type="string",Description="Method or methods allowed when accessing the resource" } },
                    { "Access-Control-Allow-Headers", new Header(){Type="string",Description="Used in response to a preflight request to indicate which HTTP headers can be used when making the request." } },
                }
            };
            return new Operation
            {
                Consumes = new List<string> { "application/json" },
                Produces = new List<string> { "application/json" },
                Responses = new Dictionary<string, Response>{{"200",response}}
            };
        }

        private object BuildApiGatewayIntegrationExtension()
        {
            return new
            {
                responses = new
                {
                    @default = new
                    {
                        statusCode = "200",
                        responseParameters = new Dictionary<string, string>
                            {
                                { "method.response.header.Access-Control-Allow-Methods", "'POST,GET,OPTIONS'" },
                                { "method.response.header.Access-Control-Allow-Headers", "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'"},
                                { "method.response.header.Access-Control-Allow-Origin", "'*'"}
                            }
                    },
                },
                passthroughBehavior = "when_no_match",
                requestTemplates = new Dictionary<string, string> { { "application/json", "{\"statusCode\": 200}" } },
                type = "mock"
            };
        }

        public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
        {
            foreach (var path in swaggerDoc.Paths)
            {
                var corsOptionOperation = BuildCorsOptionOperation();
                var awsApiGatewayExtension = BuildApiGatewayIntegrationExtension();
                corsOptionOperation.Extensions.Add("x-amazon-apigateway-integration", awsApiGatewayExtension);
                path.Value.Options = corsOptionOperation;
            }
        }
    }

Jangan lupa untuk mendaftarkan filter itu di swashbuckle:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Info { Title = "My API", Version = "v1" });
            c.DocumentFilter<AddCorsApiGatewayDocumentFilter>();
        });
    }

1
2018-02-27 22:26



Lakukan langkah-langkah untuk 'Aktifkan CORS' menggunakan fitur satu-klik yang mudah di konsol, kemudian gunakan API, dan akhirnya masuk ke Panggung dan Ekspor API kembali ke kesombongan.

Sekarang Anda dapat memeriksa kesombongan untuk melihat cara mengonfigurasi CORS dengan kesombongan Anda sendiri.


0
2017-12-06 18:49



Saya memiliki masalah yang sama dan saya akhirnya membuat utilitas di Java yang secara otomatis menambahkan header ini ke Swagger JSON. Anda dapat menjalankannya sebelum mengimpornya ke API Gateway dan mengimpor output JSON yang telah mengaktifkan CORS di semua metode

https://github.com/anandlalvb/SwaggerToAPIGateway

Ini adalah tugas yang membosankan untuk menambahkan header ini ke semua metode Anda di Swagger JSON.

            "headers": {
            "Access-Control-Allow-Origin": {
                "type": "string"
            },
            "Access-Control-Allow-Methods": {
                "type": "string"
            },
            "Access-Control-Allow-Headers": {
                "type": "string"
            }
        }

Saya harap utilitas ini dapat membantu Anda melakukannya dengan mudah


0
2018-06-02 03:32