Pencegat HTTP - AWS SDK for Go v2

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Pencegat HTTP

Anda dapat menggunakan pencegat untuk menghubungkan eksekusi permintaan dan tanggapan API. Pencegat adalah mekanisme terbuka di mana SDK memanggil kode yang Anda tulis untuk menyuntikkan perilaku ke dalam siklus hidup. request/response Dengan cara ini, Anda dapat mengubah permintaan dalam penerbangan, proses permintaan debug, pengecualian tampilan, dan lainnya.

Pencegat vs middleware

AWS SDK for Go V2 menyediakan pencegat dan middleware untuk menyesuaikan pemrosesan permintaan. Meskipun keduanya melayani tujuan yang sama, keduanya dirancang untuk audiens dan kasus penggunaan yang berbeda:

  • Interceptor dirancang untuk pengguna SDK yang ingin menyesuaikan request/response pemrosesan dengan API sederhana yang berfokus pada HTTP. Mereka menyediakan titik kait tertentu dalam siklus hidup permintaan dan bekerja secara langsung dengan permintaan dan tanggapan HTTP.

  • Middleware adalah sistem transport-agnostik yang lebih canggih yang terutama digunakan secara internal oleh SDK. Meskipun kuat, middleware membutuhkan pengetahuan yang lebih dalam tentang internal SDK dan melibatkan antarmuka yang lebih kompleks.

Keuntungan utama pencegat dibandingkan middleware untuk kasus penggunaan umum:

  • Berfokus pada HTTP: Interceptor bekerja secara langsung dengan permintaan dan tanggapan HTTP, menghilangkan kebutuhan untuk memeriksa tipe transport yang dibutuhkan middleware.

  • Antarmuka yang lebih sederhana: Setiap kait pencegat memiliki antarmuka yang spesifik dan terfokus daripada pola middleware generik.

  • Model eksekusi yang lebih jelas: Pencegat mengeksekusi pada titik yang terdefinisi dengan baik dalam siklus hidup permintaan tanpa memerlukan pengetahuan tentang pemesanan tumpukan middleware.

catatan

Pencegat dibangun di atas sistem middleware yang ada, sehingga keduanya dapat hidup berdampingan dalam aplikasi yang sama. Middleware tetap tersedia untuk kasus penggunaan lanjutan yang memerlukan perilaku transport-agnostik atau manipulasi tumpukan kompleks.

Kait pencegat yang tersedia

AWS SDK for Go V2 menyediakan kait pencegat pada berbagai tahap siklus hidup permintaan. Setiap kait sesuai dengan antarmuka tertentu yang dapat Anda terapkan:

  • BeforeExecution- Hook pertama dipanggil selama eksekusi operasi

  • BeforeSerialization- Sebelum pesan masukan diserialisasikan ke dalam permintaan transport

  • AfterSerialization- Setelah pesan masukan diserialisasikan ke dalam permintaan transportasi

  • BeforeRetryLoop- Sebelum memasuki loop coba lagi

  • BeforeAttempt- Kait pertama disebut di dalam loop coba lagi

  • BeforeSigning- Sebelum permintaan transportasi ditandatangani

  • AfterSigning- Setelah permintaan transportasi ditandatangani

  • BeforeTransmit- Sebelum permintaan transportasi dikirim

  • AfterTransmit- Setelah menerima respon transportasi

  • BeforeDeserialization- Sebelum respon transportasi dideserialisasi

  • AfterDeserialization- Setelah membongkar respons transportasi

  • AfterAttempt- Kait terakhir disebut di dalam loop coba lagi

  • AfterExecution- Hook terakhir dipanggil selama eksekusi operasi

Anda dapat mengimplementasikan beberapa antarmuka dalam satu pencegat untuk menghubungkan ke beberapa tahap siklus hidup permintaan.

Pendaftaran pencegat

Anda mendaftarkan pencegat ketika Anda membangun klien layanan atau ketika Anda mengganti konfigurasi untuk operasi tertentu. Pendaftaran berbeda tergantung pada apakah Anda ingin pencegat berlaku untuk semua operasi untuk klien Anda atau hanya yang spesifik.

Pencegat dikelola melalui registri pencegat yang menyediakan metode untuk menambah dan menghapus pencegat. Contoh berikut menunjukkan pencegat sederhana yang menambahkan header ID AWS X-Ray jejak ke permintaan keluar sebelum proses penandatanganan:

type recursionDetection struct{} func (recursionDetection) BeforeSigning(ctx context.Context, in *smithyhttp.InterceptorContext) error { if traceID := os.Getenv("_X_AMZN_TRACE_ID"); traceID != "" { in.Request.Header.Set("X-Amzn-Trace-Id", traceID) } return nil } // use it on the client svc := s3.NewFromConfig(cfg, func(o *s3.Options) { o.Interceptors.AddBeforeSigning(recursionDetection{}) })

Registri pencegat ditambahkan ke Opsi klien, yang memungkinkan konfigurasi pencegat per operasi:

// ... or use it per-operation s3.ListBuckets(context.Background(), &s3.ListBucketsInput{ }, func(o *s3.Options) { o.Interceptors.AddBeforeSigning(recursionDetection{}) })

Konfigurasi pencegat global

Anda juga dapat mendaftarkan pencegat secara global menggunakan config.LoadDefaultConfig fungsi dengan With* opsi yang sesuai untuk setiap jenis pencegat. Ini berlaku pencegat untuk semua klien AWS layanan yang dibuat dari konfigurasi itu:

type myExecutionInterceptor struct{} func (*myExecutionInterceptor) AfterExecution(ctx context.Context, in *smithyhttp.InterceptorContext) error { // Add your custom logic here return nil } cfg, err := config.LoadDefaultConfig(context.Background(), config.WithAfterExecution(&myExecutionInterceptor{})) if err != nil { panic(err) } // every service client created from the above config // will include this interceptor svc := s3.NewFromConfig(cfg)