Mengonfigurasi pemecah masalah GraphQL
BERLAKU UNTUK: Semua tingkatAN API Management
Konfigurasikan resolver untuk mengambil atau mengatur data untuk bidang GraphQL dalam jenis objek yang ditentukan dalam skema GraphQL. Skema harus diimpor ke API Management sebagai API GraphQL.
Catatan
Saat ini, fitur ini tidak tersedia di ruang kerja.
Saat ini, API Management mendukung resolver yang dapat mengakses sumber data berikut:
- Sumber data berbasis HTTP (REST atau SOAP API)
- Database Cosmos DB
- Azure SQL database
Hal-hal yang perlu diketahui
- Resolver adalah sumber daya yang berisi definisi kebijakan yang hanya dipanggil saat jenis objek dan bidang yang cocok dalam skema dijalankan.
- Setiap resolver menyelesaikan data untuk satu bidang. Untuk mengatasi data untuk beberapa bidang, konfigurasikan pemecah masalah terpisah untuk masing-masing bidang.
- Kebijakan yang dilingkup resolver dievaluasi setelah setiap
inbound
danbackend
kebijakan dalam alur eksekusi kebijakan. Mereka tidak mewarisi kebijakan dari cakupan lain. Untuk informasi selengkapnya, lihat Kebijakan di API Management. - Anda dapat mengonfigurasi kebijakan cakupan API untuk API GraphQL, terlepas dari kebijakan cakupan penyelesai. Misalnya, tambahkan kebijakan validate-graphql-request ke
inbound
cakupan untuk memvalidasi permintaan sebelum resolver dipanggil. Konfigurasikan kebijakan cakupan API pada tab kebijakan API untuk API. - Untuk mendukung jenis antarmuka dan union di pemecah masalah GraphQL, respons backend harus sudah berisi
__typename
bidang , atau diubah menggunakan kebijakan set-body untuk menyertakan__typename
.
Prasyarat
- Instans API Management yang ada. Buat jika Anda belum melakukannya.
- Mengimpor API GraphQL pass-through atau sintetis.
Membuat resolver
Langkah-langkah berikut membuat resolver menggunakan sumber data berbasis HTTP. Langkah-langkah umum mirip untuk pemecah masalah apa pun yang menggunakan sumber data yang didukung.
Di Portal Microsoft Azure, navigasikan ke instans API Management Anda.
Di menu sebelah kiri, pilih API lalu nama API GraphQL Anda.
Pada tab Skema , tinjau skema untuk bidang dalam jenis objek tempat Anda ingin mengonfigurasi pemecah masalah.
Pilih bidang, lalu di margin kiri, arahkan penunjuk.
Pilih + Tambahkan Resolver.
Pada halaman Buat Resolver :
- Perbarui properti Nama jika Anda mau, secara opsional masukkan Deskripsi, dan konfirmasi atau perbarui pilihan Tipe dan Bidang.
- Pilih sumber Data penyelesai. Untuk contoh ini, pilih HTTP API.
Di editor kebijakan Resolver, perbarui
http-data-source
kebijakan dengan elemen turunan untuk skenario Anda.Perbarui elemen yang diperlukan
http-request
dengan kebijakan untuk mengubah operasi GraphQL ke permintaan HTTP.Secara opsional tambahkan
http-response
elemen, dan tambahkan kebijakan turunan untuk mengubah respons HTTP pemecah masalah.http-response
Jika elemen tidak ditentukan, respons dikembalikan sebagai string mentah.Pilih Buat.
Pemecah masalah dilampirkan ke bidang dan muncul di tab Pemecah Masalah .
Mengelola resolver
Mencantumkan dan mengelola resolver untuk API GraphQL pada tab Resolver API.
Pada tab Pemecah Masalah :
Kolom Tertaut menunjukkan apakah resolver dikonfigurasi untuk bidang yang saat ini berada dalam skema GraphQL. Jika resolver tidak ditautkan, resolver tidak dapat dipanggil.
Di menu konteks (...) untuk pemecah masalah, temukan perintah untuk Mengkloning, Mengedit, atau Menghapus pemecah masalah. Kloning resolver yang tercantum untuk membuat resolver serupa dengan cepat yang menargetkan jenis dan bidang yang berbeda.
Anda dapat membuat resolver baru dengan memilih + Buat.
Mengedit dan menguji resolver
Saat Anda mengedit pemecah masalah tunggal, halaman Edit pemecah masalah terbuka. Anda dapat:
Perbarui kebijakan resolver dan secara opsional sumber data. Mengubah sumber data menimpa kebijakan resolver saat ini.
Ubah jenis dan bidang yang ditargetkan pemecah masalah.
Uji dan debug konfigurasi resolver. Saat Anda mengedit kebijakan resolver, pilih Jalankan Uji untuk memeriksa output dari sumber data, yang dapat Anda validasi terhadap skema. Jika terjadi kesalahan, respons menyertakan informasi pemecahan masalah.
Konteks GraphQL
- Konteks untuk permintaan dan respons penyelesai (jika ditentukan) berbeda dari konteks untuk permintaan API gateway asli:
context.GraphQL
properti diatur ke argumen (Arguments
) dan objek induk (Parent
) untuk eksekusi resolver saat ini.- Konteks permintaan berisi argumen yang diteruskan dalam kueri GraphQL sebagai isinya.
- Konteks respons adalah respons dari panggilan independen yang dilakukan oleh resolver, bukan konteks untuk respons lengkap untuk permintaan gateway.
Variabel
context
yang diteruskan melalui alur permintaan dan respons ditambah dengan konteks GraphQL saat digunakan dengan pemecah masalah GraphQL.
konteks. GraphQL.parent
context.GraphQL.parent
diatur ke objek induk untuk eksekusi penyelesai saat ini. Pertimbangkan skema parsial berikut:
type Comment {
id: ID!
owner: string!
content: string!
}
type Blog {
id: ID!
title: string!
content: string!
comments: [Comment]!
comment(id: ID!): Comment
}
type Query {
getBlog(): [Blog]!
getBlog(id: ID!): Blog
}
Selain itu, pertimbangkan kueri GraphQL untuk semua informasi untuk blog tertentu:
query {
getBlog(id: 1) {
title
content
comments {
id
owner
content
}
}
}
Jika Anda mengatur pemecah masalah untuk comments
bidang dalam jenis , Blog
Anda mungkin ingin memahami ID blog mana yang akan digunakan. Anda bisa mendapatkan ID blog menggunakan context.GraphQL.Parent["id"]
seperti yang ditunjukkan di pemecah masalah berikut:
<http-data-source>
<http-request>
<set-method>GET</set-method>
<set-url>@($"https://data.contoso.com/api/blog/{context.GraphQL.Parent["id"]}")
</set-url>
</http-request>
</http-data-source>
konteks. GraphQL.Arguments
Argumen untuk kueri GraphQL berparameter ditambahkan ke context.GraphQL.Arguments
. Misalnya, pertimbangkan dua kueri berikut:
query($id: Int) {
getComment(id: $id) {
content
}
}
query {
getComment(id: 2) {
content
}
}
Kueri ini merupakan dua cara untuk memanggil penyelesai getComment
. GraphQL mengirimkan payload JSON berikut:
{
"query": "query($id: Int) { getComment(id: $id) { content } }",
"variables": { "id": 2 }
}
{
"query": "query { getComment(id: 2) { content } }"
}
Anda dapat menentukan penyelesai sebagai berikut:
<http-data-source>
<http-request>
<set-method>GET</set-method>
<set-url>@($"https://data.contoso.com/api/comment/{context.GraphQL.Arguments["id"]}")</set-url>
</http-request>
</http-data-source>
Langkah berikutnya
Untuk contoh pemecah masalah lainnya, lihat: