GraphQL-resolver instellen (buiten gebruik gesteld)

Belangrijk

  • Het set-graphql-resolver beleid wordt buiten gebruik gesteld. Klanten die het set-graphql-resolver beleid gebruiken, moeten migreren naar de beheerde resolvers voor GraphQL-API's, die verbeterde functionaliteit bieden.
  • Nadat u een beheerde resolver voor een GraphQL-veld hebt geconfigureerd, slaat de gateway het set-graphql-resolver beleid over in beleidsdefinities. U kunt het gebruik van beheerde resolvers en het set-graphql-resolver beleid in uw API Management-exemplaar niet combineren.

Met set-graphql-resolver het beleid worden gegevens opgehaald of ingesteld voor een GraphQL-veld in een objecttype dat is opgegeven in een GraphQL-schema. Het schema moet worden geïmporteerd in API Management. Momenteel moeten de gegevens worden omgezet met behulp van een HTTP-gegevensbron (REST of SOAP API).

Notitie

Stel de elementen van het beleid en onderliggende elementen in de volgorde in die is opgegeven in de beleidsverklaring. Meer informatie over het instellen of bewerken van API Management beleid.

Beleidsverklaring

<set-graphql-resolver parent-type="type" field="field"> 
    <http-data-source> 
        <http-request> 
            <set-method>...set-method policy configuration...</set-method> 
            <set-url>URL</set-url>
            <set-header>...set-header policy configuration...</set-header>
            <set-body>...set-body policy configuration...</set-body>
            <authentication-certificate>...authentication-certificate policy configuration...</authentication-certificate>  
        </http-request> 
        <http-response>
            <set-body>...set-body policy configuration...</set-body>
            <xml-to-json>...xml-to-json policy configuration...</xml-to-json>
            <find-and-replace>...find-and-replace policy configuration...</find-and-replace>
        </http-response>
      </http-data-source> 
</set-graphql-resolver> 

Kenmerken

Kenmerk Beschrijving Vereist Standaard
bovenliggend type Een objecttype in het GraphQL-schema. Ja N.v.t.
veld Een veld van de die is opgegeven parent-type in het GraphQL-schema. Ja N.v.t.

Notitie

Momenteel worden de waarden van parent-type en field niet gevalideerd door dit beleid. Als ze niet geldig zijn, wordt het beleid genegeerd en wordt de GraphQL-query doorgestuurd naar een GraphQL-eindpunt (als dit is geconfigureerd).

Elementen

Naam Beschrijving Vereist
http-gegevensbron Hiermee configureert u de HTTP-aanvraag en optioneel het HTTP-antwoord dat wordt gebruikt voor het oplossen van gegevens voor de opgegeven parent-type en field. Yes
http-aanvraag Hiermee geeft u een URL en onderliggend beleid voor het configureren van de HTTP-aanvraag van de resolver. Yes
http-antwoord Geeft desgewenst onderliggend beleid op om het HTTP-antwoord van de resolver te configureren. Als dit niet is opgegeven, wordt het antwoord geretourneerd als een onbewerkte tekenreeks.

HTTP-aanvraagelementen

Notitie

Behalve waar aangegeven, kan elk onderliggend element maximaal één keer worden opgegeven. Geef elementen op in de aangegeven volgorde.

Element Beschrijving Vereist
set-method Hiermee stelt u de methode van de HTTP-aanvraag van de resolver in. Yes
set-url Hiermee stelt u de URL van de HTTP-aanvraag van de resolver. Yes
set-header Hiermee stelt u een header in de HTTP-aanvraag van de resolver. Als er meerdere kopteksten zijn, voegt u extra header elementen toe. No
hoofdtekst instellen Hiermee stelt u de hoofdtekst in de HTTP-aanvraag van de resolver in. No
verificatiecertificaat Verifieert met behulp van een clientcertificaat in de HTTP-aanvraag van de resolver. No

http-response-elementen

Notitie

Elk onderliggend element kan maximaal één keer worden opgegeven. Geef elementen op in de aangegeven volgorde.

Naam Beschrijving Vereist
hoofdtekst instellen Hiermee stelt u de hoofdtekst in het HTTP-antwoord van de resolver. No
xml-to-json Transformeert het HTTP-antwoord van de resolver van XML naar JSON. No
zoeken en vervangen Zoekt een subtekenreeks in het HTTP-antwoord van de resolver en vervangt deze door een andere subtekenreeks. No

Gebruik

Gebruiksopmerkingen

  • Dit beleid wordt alleen aangeroepen wanneer een overeenkomende GraphQL-query wordt uitgevoerd.
  • Met het beleid worden gegevens voor één veld omgezet. Als u gegevens voor meerdere velden wilt oplossen, configureert u meerdere exemplaren van dit beleid in een beleidsdefinitie.

GraphQL-context

  • De context voor de HTTP-aanvraag en het HTTP-antwoord (indien opgegeven) verschilt van de context voor de oorspronkelijke gateway-API-aanvraag:
    • context.ParentResult is ingesteld op het bovenliggende object voor de huidige uitvoering van de resolver.
    • De http-aanvraagcontext bevat argumenten die als hoofdtekst worden doorgegeven in de GraphQL-query.
    • De HTTP-antwoordcontext is het antwoord van de onafhankelijke HTTP-aanroep van de resolver, niet de context voor het volledige antwoord voor de gatewayaanvraag. De context variabele die wordt doorgegeven via de aanvraag- en antwoordpijplijn, wordt uitgebreid met de GraphQL-context wanneer deze wordt gebruikt met <set-graphql-resolver> beleid.

ParentResult

De context.ParentResult is ingesteld op het bovenliggende object voor de huidige uitvoering van de resolver. Bekijk het volgende gedeeltelijke 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
}

Overweeg ook een GraphQL-query voor alle informatie voor een specifiek blog:

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

Als u een resolver instelt voor parent-type="Blog" field="comments", wilt u weten welke blog-id u moet gebruiken. U kunt de id van de blog ophalen met behulp van context.ParentResult.AsJObject()["id"].ToString(). Het beleid voor het configureren van deze resolver ziet er ongeveer als volgt uit:

<set-graphql-resolver parent-type="Blog" field="comments">
    <http-data-source>
        <http-request>
            <set-method>GET</set-method>
            <set-url>@{
                var blogId = context.ParentResult.AsJObject()["id"].ToString();
                return $"https://data.contoso.com/api/blog/{blogId}";
            }</set-url>
        </http-request>
    </http-data-source>
</set-graphql-resolver>

Argumenten

De argumenten voor een GraphQL-query met parameters worden toegevoegd aan de hoofdtekst van de aanvraag. Neem bijvoorbeeld de volgende twee query's:

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

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

Deze query's zijn twee manieren om de getComment resolver aan te roepen. GraphQL verzendt de volgende JSON-nettolading:

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

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

Wanneer de resolver wordt uitgevoerd, wordt de arguments eigenschap toegevoegd aan de hoofdtekst. U kunt de resolver als volgt definiëren:

<set-graphql-resolver parent-type="Blog" field="comments">
    <http-data-source>
        <http-request>
            <set-method>GET</set-method>
            <set-url>@{
                var commentId = context.Request.Body.As<JObject>(true)["arguments"]["id"];
                return $"https://data.contoso.com/api/comment/{commentId}";
            }</set-url>
        </http-request>
    </http-data-source>
</set-graphql-resolver>

Meer voorbeelden

Resolver voor GraphQL-query

In het volgende voorbeeld wordt een query omgezet door een HTTP-aanroep GET naar een back-endgegevensbron te maken.

Voorbeeldschema

type Query {
    users: [User]
}

type User {
    id: String!
    name: String!
}

Voorbeeldbeleid

<set-graphql-resolver parent-type="Query" field="users">
    <http-data-source>
        <http-request>
            <set-method>GET</set-method>
            <set-url>https://data.contoso.com/get/users</set-url>
        </http-request>
    </http-data-source>
</set-graphql-resolver>

Resolver voor een GraqhQL-query die een lijst retourneert met behulp van een vloeibare sjabloon

In het volgende voorbeeld wordt een vloeibare sjabloon gebruikt, ondersteund voor gebruik in het set-body-beleid , om een lijst te retourneren in het HTTP-antwoord op een query. De naam van het username veld in het antwoord van de REST API name wordt ook gewijzigd in in het GraphQL-antwoord.

Voorbeeldschema

type Query {
    users: [User]
}

type User {
    id: String!
    name: String!
}

Voorbeeldbeleid

<set-graphql-resolver parent-type="Query" field="users">
    <http-data-source>
        <http-request>
            <set-method>GET</set-method>
            <set-url>https://data.contoso.com/users</set-url>
        </http-request>
        <http-response>
            <set-body template="liquid">
                [
                    {% JSONArrayFor elem in body %}
                        {
                            "name": "{{elem.username}}"
                        }
                    {% endJSONArrayFor %}
                ]
            </set-body>
        </http-response>
    </http-data-source>
</set-graphql-resolver>

Resolver voor GraphQL-mutatie

In het volgende voorbeeld wordt een mutatie opgelost die gegevens invoegt door een POST aanvraag in te dienen bij een HTTP-gegevensbron. De beleidsexpressie in het set-body beleid van de HTTP-aanvraag wijzigt een name argument dat in de GraphQL-query als hoofdtekst wordt doorgegeven. De hoofdtekst die wordt verzonden, ziet eruit als de volgende JSON:

{
    "name": "the-provided-name"
}

Voorbeeldschema

type Query {
    users: [User]
}

type Mutation {
    makeUser(name: String!): User
}

type User {
    id: String!
    name: String!
}

Voorbeeldbeleid

<set-graphql-resolver parent-type="Mutation" field="makeUser">
    <http-data-source>
        <http-request>
            <set-method>POST</set-method>
            <set-url> https://data.contoso.com/user/create </set-url>
            <set-header name="Content-Type" exists-action="override">
                <value>application/json</value>
            </set-header>
            <set-body>@{
                var args = context.Request.Body.As<JObject>(true)["arguments"];  
                JObject jsonObject = new JObject();
                jsonObject.Add("name", args["name"])
                return jsonObject.ToString();
            }</set-body>
        </http-request>
    </http-data-source>
</set-graphql-resolver>

Zie voor meer informatie over het werken met beleid: