Set GraphQL Resolver (eingestellt)

Wichtig

  • Die Richtlinie „set-graphql-resolver“ wird eingestellt. Kunden, die die Richtlinie „set-graphql-resolver“ verwenden, müssen zu den verwalteten Resolvern für GraphQL-APIs migrieren, die erweiterte Funktionen bieten.
  • Nachdem Sie einen verwalteten Resolver für ein GraphQL-Feld konfiguriert haben, überspringt das Gateway die Richtlinie „set-graphql-resolver“ in allen Richtliniendefinitionen. Sie können die Verwendung von verwalteten Resolvern und der Richtlinie set-graphql-resolver in Ihrer API Management-Instanz nicht kombinieren.

Die set-graphql-resolver-Richtlinie ruft Daten ab oder legt sie für ein GraphQL-Feld in einem Objekttyp fest, der in einem GraphQL-Schema angegeben ist. Das Schema muss in das API Management importiert werden. Derzeit müssen die Daten mithilfe einer HTTP-basierten Datenquelle (REST- oder SOAP-API) aufgelöst werden.

Hinweis

Legen Sie die Elemente und untergeordneten Elemente einer Richtlinie in der Reihenfolge fest, die in der Richtlinienanweisung angegeben ist. Erfahren Sie mehr darüber, wie Sie API Management-Richtlinien festlegen oder bearbeiten.

Richtlinienanweisung

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

Attribute

attribute BESCHREIBUNG Erforderlich Standard
parent-type Ein Objekttyp im GraphQL-Schema Ja
Feld Ein Feld des angegebenen parent-type im GraphQL-Schema Ja

Hinweis

Derzeit werden die Werte parent-type und field nicht von dieser Richtlinie überprüft. Wenn sie ungültig sind, wird die Richtlinie ignoriert, und die GraphQL-Abfrage wird an einen GraphQL-Endpunkt weitergeleitet, falls einer konfiguriert ist.

Elemente

Name BESCHREIBUNG Erforderlich
http-data-source Konfiguriert die HTTP-Anforderung und optional die HTTP-Antwort, die zum Auflösen von Daten für die angegebenen parent-type und field verwendet werden Yes
http-request Gibt eine URL und untergeordnete Richtlinien an, um die HTTP-Anforderung des Resolvers zu konfigurieren. Ja
http-response Gibt optional untergeordnete Richtlinien an, um die HTTP-Antwort des Resolvers zu konfigurieren. Wenn die Antwort nicht angegeben ist, wird sie als Rohzeichenfolge zurückgegeben.

http-request-Elemente

Hinweis

Sofern nicht anders angegeben, darf jedes untergeordnete Element höchstens einmal festgelegt werden. Geben Sie Elemente in der aufgeführten Reihenfolge an.

Element BESCHREIBUNG Erforderlich
set-method Legt die Methode der HTTP-Anforderung des Auflösers fest. Ja
set-url Die URL der HTTP-Anforderung des Auflösers. Ja
set-header Legt einen Header in der HTTP-Anforderung des Auflösers fest. Wenn mehrere Header vorhanden sind, fügen Sie zusätzliche header-Elemente hinzu. Nein
set-body Legt den Text in der HTTP-Anforderung des Auflösers fest. Nein
authentication-certificate Authentifiziert sich mithilfe eines Clientzertifikats in der HTTP-Anforderung des Auflösers. Nein

http-response-Elemente

Hinweis

Jedes untergeordnete Element kann höchstens einmal angegeben werden. Geben Sie Elemente in der aufgeführten Reihenfolge an.

Name BESCHREIBUNG Erforderlich
set-body Legt den Text in der HTTP-Antwort des Auflösers fest. Nein
xml-to-json Transformiert die HTTP-Antwort des Auflösers von XML in JSON. Nein
find-and-replace Sucht eine Teilzeichenfolge in der HTTP-Antwort des Auflösers und ersetzt sie durch eine andere Teilzeichenfolge. Nein

Verwendung

Hinweise zur Verwendung

  • Diese Richtlinie wird nur aufgerufen, wenn eine übereinstimmende GraphQL-Abfrage ausgeführt wird.
  • Die Richtlinie löst Daten für ein einzelnes Feld auf. Um Daten für mehrere Felder aufzulösen, konfigurieren Sie mehrere Instanzen dieser Richtlinie in einer Richtliniendefinition.

GraphQL-Kontext

  • Der Kontext für die HTTP-Anforderung und die HTTP-Antwort (falls angegeben) unterscheidet sich vom Kontext für die ursprüngliche Gateway-API-Anforderung:
    • context.ParentResult wird auf das übergeordnete Objekt für die aktuelle Auflösungsausführung festgelegt.
    • Der HTTP-Anforderungskontext enthält Argumente, die in der GraphQL-Abfrage als deren Textkörper übergeben werden.
    • Beim HTTP-Antwortkontext handelt es sich um die Antwort des unabhängigen HTTP-Aufrufs des Resolvers, nicht um den Kontext für die vollständige Antwort für die Gatewayanforderung. Die context-Variable, die über die Anforderungs- und Antwortpipeline übergeben wird, wird mit dem GraphQL-Kontext erweitert, wenn sie mit <set-graphql-resolver>-Richtlinien verwendet werden.

ParentResult

Das context.ParentResult wird auf das übergeordnete Objekt für die aktuelle Auflösungsausführung festgelegt. Betrachten Sie folgendes partielles 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
}

Berücksichtigen Sie auch eine GraphQL-Abfrage für alle Informationen für einen bestimmten Blog:

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

Wenn Sie einen Auflösungsgeber für parent-type="Blog" field="comments" festlegen, möchten Sie verstehen, welche Blog-ID verwendet werden soll. Sie können die ID des Blogs mithilfe von context.ParentResult.AsJObject()["id"].ToString() erhalten. Die Richtlinie zum Konfigurieren dieses Lösungsgebers würde wie folgt aussehen:

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

Argumente

Die Argumente für eine parameterisierte GraphQL-Abfrage werden dem Textkörper der Anforderung hinzugefügt. Sehen Sie sich beispielsweise die folgenden zwei Abfragen an:

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

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

Diese Abfragen sind zwei Möglichkeiten zum Aufrufen des getComment-Auflösungsgebers. GraphQL sendet die folgende JSON-Nutzlast:

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

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

Wenn der Auflösungsgeber ausgeführt wird, wird die Eigenschaft arguments dem Textkörper hinzugefügt. Sie können den Auflösungsgeber wie folgt definieren:

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

Weitere Beispiele anzeigen

Resolver für die GraphQL-Abfrage

Im folgenden Beispiel wird eine Abfrage aufgelöst, indem ein HTTP-GET-Aufruf an eine Back-End-Datenquelle ausgeführt wird.

Beispielschema

type Query {
    users: [User]
}

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

Beispielrichtlinie

<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 für eine GraphQL-Abfrage, die unter Verwendung einer Liquid-Vorlage eine Liste zurückgibt

Im folgenden Beispiel wird eine Liquid-Vorlage verwendet, die zum Verwenden in der set-body-Richtlinie unterstützt wird, um in der HTTP-Antwort auf eine Abfrage eine Liste zurückzugeben. Außerdem wird das username Feld in der Antwort der REST-API in die GraphQL-Antwort name umbenannt.

Beispielschema

type Query {
    users: [User]
}

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

Beispielrichtlinie

<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 für eine GraphQL-Mutation

Im folgenden Beispiel wird eine Mutation aufgelöst, die Daten einfügt, indem sie eine POST-Anforderung an eine HTTP-Datenquelle stellt. Der Richtlinienausdruck in der set-body-Richtlinie der HTTP-Anforderung ändert ein name-Argument, das in der GraphQL-Abfrage als deren Textkörper übergeben wird. Der gesendete Text sieht wie die folgende JSON aus:

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

Beispielschema

type Query {
    users: [User]
}

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

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

Beispielrichtlinie

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

Weitere Informationen zum Arbeiten mit Richtlinien finden Sie hier: