We’ll continue our exploration of the GraphQL features in Azure API Management by having a look at another feature; the possibility to transform an existing SOAP or REST API in an GraphQL API(Synthetic GraphQL). (If you missed the previous post in this series, have a look here.) Let's walk through the steps.
The REST API
Let’s first have a look at our REST API that we’ll use in this post. I’ve created an Azure Function that can be called through a GET request and returns a Person object(similar to the GraphQL API I used in the previous post).
Here is the related code:
public class RestFunction | |
{ | |
private readonly ILogger<RestFunction> _logger; | |
public RestFunction(ILogger<RestFunction> log) | |
{ | |
_logger = log; | |
} | |
[FunctionName("GetPerson")] | |
[OpenApiOperation(operationId: "GetPerson")] | |
[OpenApiResponseWithBody(statusCode: HttpStatusCode.OK, contentType: "text/plain", bodyType: typeof(Person), Description = "The OK response")] | |
public async Task<IActionResult> Run( | |
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req) | |
{ | |
_logger.LogInformation("C# HTTP trigger function processed a request."); | |
return new OkObjectResult(new Person("Luke Skywalker")); | |
} | |
} |
Create a Synthetic GraphQL API
Let’s see how we can expose this REST API as a ‘Synthetic GraphQL’ API through Azure API Management.
- Go to your Azure API Management instance in the Azure portal.
- From the side menu, select APIs in the APIs section:
- Choose Synthetic GraphQL under Define a new API:
- In the dialog box specify the following fields:
- Display name: The name you want to use to recognize your API
- Name: Autogenerated based on the display name
- Schema file: The GraphQL schema that will be exposed through this endpoint
- In this example, I’ll use the following GraphQL schema:
type Query { | |
person: Person | |
} | |
type Person { | |
name: String | |
} |
- Click on Create to import the GraphQL schema.
- After the API is imported you can browse the schema on the Design tab:
Of course right now there isn’t anything useful with this API as it isn’t linked to our existing REST API. To change this, we have to create a set-graphql-resolver policy to map a field in the schema to an existing HTTP endpoint.
-
In the Backend processing section, select the Backend Policy code editor:
-
Configure the
set-graphql-resolver
policy to resolve our REST api using an HTTP data source:
<set-graphql-resolver parent-type="Query" field="person"> | |
<http-data-source> | |
<http-request> | |
<set-method>GET</set-method> | |
<set-url>https://restfunctionapp20220807115633.azurewebsites.net/api/GetPerson</set-url> | |
</http-request> | |
</http-data-source> | |
</set-graphql-resolver> |
-
Click on Save to apply the policy.
- To test our API endpoint, go to the Test tab. Select the fields you want to fetch or write your GraphQL query from scratch:
More information: https://docs.microsoft.com/en-us/azure/api-management/graphql-schema-resolve-api