Dela via


Konfigurera en GraphQL-lösare

GÄLLER FÖR: Alla API Management-nivåer

Konfigurera en matchare för att hämta eller ange data för ett GraphQL-fält i en objekttyp som anges i ett GraphQL-schema. Schemat måste importeras till API Management som ett GraphQL-API.

Kommentar

För närvarande är den här funktionen inte tillgänglig på arbetsytor.

API Management stöder för närvarande matchare som kan komma åt följande datakällor:

Bra att känna till

  • En resolver är en resurs som innehåller en policydeskrivning som bara anropas när en matchande objekttyp och ett matchande fält i schemat exekveras.
  • Varje resolver löser data för ett enda fält. Om du vill lösa data för flera fält konfigurerar du en separat lösning för var och en.
  • Policys med upplösningsomfattning utvärderas efter alla inbound och backend policys i policykörningsrörledningen. De ärver inte principer från andra omfång. Mer information finns i Principer i Azure API Management.
  • Du kan konfigurera API-omfattande regler för ett GraphQL-API, oberoende av lösaromfångsprinciperna. Lägg till exempel till en validate-graphql-request-policy i omfånget inbound för att verifiera begäran innan lösaren anropas. Konfigurera API-omfångsprinciper på fliken API-principer för API:et.
  • För att stödja gränssnitts- och unionstyper i GraphQL-resolverar måste serverdelssvaret antingen redan innehålla __typename fältet eller ändras för att inkludera med hjälp av __typename-policy.

Förutsättningar

Skapa en lösning

Följande steg skapar en lösning med hjälp av en HTTP-baserad datakälla. De allmänna stegen är liknande för alla lösare som använder en stödd datakälla.

  1. I Azure Portal navigerar du till din API Management-instans.

  2. I den vänstra menyn väljer du API:er och sedan namnet på graphQL-API:et.

  3. På fliken Schema granskar du schemat för ett fält i en objekttyp där du vill konfigurera en matchare.

    1. Välj ett fält och hovra sedan pekaren i vänstermarginalen.

    2. Välj + Lägg till lösen.

      Skärmbild av att lägga till en matchare från ett fält i GraphQL-schemat i Azure-portalen.

  4. På sidan Skapa lösning :

    1. Uppdatera egenskapen Namn om du vill, ange en Beskrivning och bekräfta eller uppdatera valen Typ och Fält.
    2. Välj lösares datakälla. I det här exemplet väljer du HTTP API.
  5. I redigeraren för Resolver-policy, uppdatera policyn med underordnade element för ditt scenario.http-data-source

    1. Uppdatera det nödvändiga http-request elementet med principer för att omvandla GraphQL-åtgärden till en HTTP-begäran.

    2. Valfritt kan ett http-response element läggas till, och underliggande policyer kan läggas till för att transformera HTTP-svaret från lösaren. Om elementet http-response inte anges returneras svaret som en råsträng.

    3. Välj Skapa.

      Skärmbild av redigeringsprogrammet för matchningsprinciper i Azure-portalen.

    Lösaren är kopplad till fältet och visas på fliken Resolvers.

    Skärmbild av matchningslistan för GraphQL API i Azure-portalen.

Hantera lösare

Du kan lista och hantera matcharna för ett GraphQL-API på fliken Matchare för API:et.

Skärmbild av administrering av resolvers för GraphQL API i Azure-portalen.

På fliken Lösare :

  • Kolumnen Länkad anger om matcharen är konfigurerad för ett fält som för närvarande finns i GraphQL-schemat. Om en resolver inte är länkad kan den inte anropas.

  • I snabbmenyn (...) för en matchare hittar du kommandon för att klona, redigera eller ta bort en matchare. Klona en listad resolver för att snabbt skapa en liknande resolver som riktar sig mot en annan typ och fält.

  • Du kan skapa en ny lösning genom att välja + Skapa.

Redigera och testa en lösning

När du redigerar en enskild resolver öppnas sidan Redigera resolver. Du kan:

  • Uppdatera resolverprincipen och eventuellt datakällan. Att ändra datakällan skriver över den aktuella lösningspolicyn.

  • Ändra den typ och det fält som lösaren riktar sig mot.

  • Testa resolvarens konfiguration och felsök den. När du redigerar matchningsprincipen väljer du Kör test för att kontrollera utdata från datakällan, som du kan verifiera mot schemat. Om fel inträffar innehåller svaret felsökningsinformation.

    Skärmbild av redigering av en lösning i Azure-portalen.

GraphQL-kontext

  • Kontexten för matcharens begäran och svar (om det anges) skiljer sig från kontexten för den ursprungliga gateway-API-begäran:
    • context.GraphQL egenskaperna anges till argumenten (Arguments) och det överordnade objektet (Parent) för den aktuella lösarens körning.
    • Begärandekontexten innehåller argument som skickas i GraphQL-frågan som brödtext.
    • Svarskontexten är svaret från det oberoende anropet som görs av lösaren, inte kontexten för det fullständiga svaret på gatewaybegäran. Variabeln context som skickas via pipelinen för begäran och svar utökas med GraphQL-kontexten när den används med en GraphQL-matchare.

sammanhang.GraphQL.parent

context.GraphQL.parent är inställt på det överordnade objektet för den aktuella resolverkörningen. Överväg följande partiella schema:

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
}

Överväg också en GraphQL-fråga för all information för en specifik blogg:

query {
    getBlog(id: 1) {
        title
        content
        comments {
            id
            owner
            content
        }
    }
}

Om du anger en lösning för comments fältet i Blog typen vill du förstå vilket blogg-ID som ska användas. Du kan hämta blogg-ID:t med context.GraphQL.Parent["id"] som visas i följande resolver:

<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>

sammanhang.GraphQL.Arguments

Argumenten för en parameteriserad GraphQL-fråga läggs till i context.GraphQL.Arguments. Tänk till exempel på följande två frågor:

query($id: Int) {
    getComment(id: $id) {
        content
    }
}

query {
    getComment(id: 2) {
        content
    }
}

Dessa frågor är två sätt att anropa matcharen getComment . GraphQL skickar följande JSON-nyttolast:

{
    "query": "query($id: Int) { getComment(id: $id) { content } }",
    "variables": { "id": 2 }
}

{
    "query": "query { getComment(id: 2) { content } }"
}

Du kan definiera lösaren på följande sätt:

<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>

Fler lösningsexempel finns i: