DJ Tsunami |
09-01-2020 02:00 |
GraphQL API requests with REST in Pawn
If anyone is interested in making requests to a GraphQL API from a plugin, here is an example using REST in Pawn:
PHP Code:
#include <sourcemod>
#include <ripext>
#pragma newdecls required
#pragma semicolon 1
HTTPClient httpClient;
public void OnPluginStart()
{
httpClient = new HTTPClient("https://api.graph.cool/simple/v1/movies");
JSONObject variables = new JSONObject();
variables.SetString("title", "Inception");
GraphQLRequest(
OnGraphQLResponse,
"query($title: String!) {"
... " Movie(title: $title) {"
... " releaseDate"
... " actors {"
... " name"
... " }"
... " }"
... "}",
variables
);
delete variables;
}
void GraphQLRequest(HTTPRequestCallback callback, const char[] query, JSONObject variables = null, any value = 0)
{
JSONObject data = new JSONObject();
data.SetString("query", query);
if (variables != null) {
data.Set("variables", variables);
}
httpClient.Post("graphql", data, callback, value);
delete data;
}
void OnGraphQLResponse(HTTPResponse response, any value, const char[] error)
{
if (error[0]) {
PrintToServer("cURL Error: %s", error);
return;
}
JSONObject obj = view_as<JSONObject>(response.Data);
if (obj.HasKey("errors")) {
JSONArray errors = view_as<JSONArray>(obj.Get("errors"));
PrintErrors(errors);
delete errors;
}
if (obj.HasKey("data") && !obj.IsNull("data")) {
JSONObject data = view_as<JSONObject>(obj.Get("data"));
JSONObject movie = view_as<JSONObject>(data.Get("Movie"));
JSONArray actors = view_as<JSONArray>(movie.Get("actors"));
char releaseDate[25];
movie.GetString("releaseDate", releaseDate, sizeof(releaseDate));
PrintToServer("Release date: %s", releaseDate);
JSONObject actor;
char actorName[25];
for (int i = 0; i < actors.Length; i++) {
actor = view_as<JSONObject>(actors.Get(i));
actor.GetString("name", actorName, sizeof(actorName));
PrintToServer("Actor name: %s", actorName);
delete actor;
}
delete (data, movie, actors);
}
}
void PrintErrors(JSONArray errors)
{
JSONObject error;
char message[1024];
for (int i = 0; i < errors.Length; i++) {
error = view_as<JSONObject>(errors.Get(i));
error.GetString("message", message, sizeof(message));
PrintToServer("API Error: %s", message);
delete error;
}
}
|