Skocz do zawartości

[smx] REST in Pawn

 Udostępnij

Rekomendowane odpowiedzi

  • Head Administrator

REST in Pawn


Kolejne rozszerzenie do pracy z HTTP, ale dopracowane do pracy z JSON REST API. Obsługuje protokoły HTTPS i gzip oraz reprezentuje funkcjonalną metodmapov ( mapy metod ) do użytku z obiektami i tablicami JSON.

 

Przykłady:

Spoiler

JSON

Spoiler

Tworzenie obiektów JSON



JSONObject someObject = new JSONObject();

someObject.SetBool("someBool", false);
someObject.SetFloat("someFloat", 1.0);
someObject.SetInt("someInt", 2);
someObject.SetString("someString", "three");
someObject.SetNull("someNull");

Pamiętaj, aby zwolnić pamięć ze wszystkich zagnieżdżonych obiektów JSON i tablic przed zwolnieniem pamięci z samego obiektu JSON.

Tworzenie tablic JSON



JSONArray someArray = new JSONArray();

someArray.PushBool(false);
someArray.PushFloat(1.0);
someArray.PushInt(2);
someArray.PushString("three");
someArray.PushNull();

Możesz także użyć metod Set * () , jeśli chcesz ustawić wartości dla określonych indeksów.

Zagnieżdżanie tablicy w obiekcie JSON



someObject.Set("someArray", someArray);

JSONArray otherArray = view_as<JSONArray>(someObject.Get("someArray"));

Get () tworzy nowy uchwyt, więc pamiętaj, aby go zamknąć, gdy skończysz.

Eksportuj, importuj z plików lub ciągów



// Экспорт
char json[256];
someObject.ToString(json, sizeof(json));

// Импорт
char path[PLATFORM_MAX_PATH + 1];
BuildPath(Path_SM, path, sizeof(path), "data/array.json");

JSONArray fileArray = JSONArray.FromFile(path);

Jeśli chcesz sformatować wynikowy kod JSON, zobacz . flagi eksportu na najwyższym poziomie json.inc wł.

 

 

Spoiler

HTTP

Ustawianie nagłówka żądania

#include <sourcemod>
#include <ripext>

HTTPClient httpClient;

public void OnPluginStart()
{
    httpClient = new HTTPClient("https://jsonplaceholder.typicode.com");

    httpClient.SetHeader("Authorization", "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==");
}

Zdobycie przedmiotu

#include <sourcemod>
#include <ripext>

HTTPClient httpClient;

public void OnPluginStart()
{
    httpClient = new HTTPClient("https://jsonplaceholder.typicode.com");

    httpClient.Get("todos/1", OnTodoReceived);
}

public void OnTodoReceived(HTTPResponse response, any value)
{
    if (response.Status != HTTPStatus_OK) {
        // Failed to retrieve todo
        return;
    }
    if (response.Data == null) {
        // Invalid JSON response
        return;
    }

    // Indicate that the response is a JSON object
    JSONObject todo = view_as<JSONObject>(response.Data);

    char todoTitle[256];
    todo.GetString("title", todoTitle, sizeof(todoTitle));

    PrintToServer("Retrieved todo with title '%s'", todoTitle);
}

Pobieranie kolekcji elementów (tablica)

#include <sourcemod>
#include <ripext>

HTTPClient httpClient;

public void OnPluginStart()
{
    httpClient = new HTTPClient("https://jsonplaceholder.typicode.com");

    httpClient.Get("todos", OnTodosReceived);
}

public void OnTodosReceived(HTTPResponse response, any value)
{
    if (response.Status != HTTPStatus_OK) {
        // Failed to retrieve todos
        return;
    }
    if (response.Data == null) {
        // Invalid JSON response
        return;
    }

    // Indicate that the response is a JSON array
    JSONArray todos = view_as<JSONArray>(response.Data);
    int numTodos = todos.Length;

    JSONObject todo;
    char todoTitle[256];

    for (int i = 0; i < numTodos; i++) {
        todo = view_as<JSONObject>(todos.Get(i));

        todo.GetString("title", todoTitle, sizeof(todoTitle));

        PrintToServer("Retrieved todo with title '%s'", todoTitle);

        // Get() creates a new handle, so delete it when we are done with it
        delete todo;
    }
}

Tworzenie przedmiotu

#include <sourcemod>
#include <ripext>

HTTPClient httpClient;

public void OnPluginStart()
{
    httpClient = new HTTPClient("https://jsonplaceholder.typicode.com");

    JSONObject todo = new JSONObject();
    todo.SetBool("completed", false);
    todo.SetInt("userId", 1);
    todo.SetString("title", "foo");

    httpClient.Post("todos", todo, OnTodoCreated);

    // JSON objects and arrays must be deleted when you are done with them
    delete todo;
}

public void OnTodoCreated(HTTPResponse response, any value)
{
    if (response.Status != HTTPStatus_Created) {
        // Failed to create todo
        return;
    }
    if (response.Data == null) {
        // Invalid JSON response
        return;
    }

    JSONObject todo = view_as<JSONObject>(response.Data);
    int todoId = todo.GetInt("id");

    PrintToServer("Created todo with ID %d", todoId);
}

Aktualizacja przedmiotu

#include <sourcemod>
#include <ripext>

HTTPClient httpClient;

public void OnPluginStart()
{
    httpClient = new HTTPClient("https://jsonplaceholder.typicode.com");

    JSONObject todo = new JSONObject();
    todo.SetBool("completed", true);

    // Some APIs replace the entire object when using PUT,
    // in which case you need to use PATCH instead.
    httpClient.Put("todos/1", todo, OnTodoUpdated);

    delete todo;
}

public void OnTodoUpdated(HTTPResponse response, any value)
{
    if (response.Status != HTTPStatus_OK) {
        // Failed to update todo
        return;
    }
    if (response.Data == null) {
        // Invalid JSON response
        return;
    }

    JSONObject todo = view_as<JSONObject>(response.Data);
    int todoId = todo.GetInt("id");

    PrintToServer("Updated todo with ID %d", todoId);
}

Usuwanie przedmiotu

#include <sourcemod>
#include <ripext>

HTTPClient httpClient;

public void OnPluginStart()
{
    httpClient = new HTTPClient("https://jsonplaceholder.typicode.com");

    httpClient.Delete("todos/1", OnTodoDeleted, 1);
}

public void OnTodoDeleted(HTTPResponse response, any value)
{
    if (response.Status != HTTPStatus_OK) {
        // Failed to delete todo
        return;
    }

    PrintToServer("Deleted todo with ID %d", value);
}

 

 

Spoiler

Rozszerzenie MethodMaps

Możesz także napisać własną mapę metod dziedziczącą po JSONObject. Dzięki temu kod będzie czystszy podczas odczytywania i ustawiania wartości JSON.

plugin.inc

methodmap Todo < JSONObject
{
    // Constructor
    public Todo() { return view_as<Todo>(new JSONObject()); }

    public void GetTitle(char[] buffer, int maxlength)
    {
        this.GetString("title", buffer, maxlength);
    }
    public void SetTitle(const char[] value)
    {
        this.SetString("title", value);
    }

    property bool Completed {
        public get() { return this.GetBool("completed"); }
        public set(bool value) { this.SetBool("completed", value); }
    }
    property int Id {
        public get() { return this.GetInt("id"); }
    }
    property int UserId {
        public get() { return this.GetInt("userId"); }
        public set(int value) { this.SetInt("userId", value); }
    }
};

plugin.sp

#include <sourcemod>
#include <ripext>
#include <plugin>

HTTPClient httpClient;

public void OnPluginStart()
{
    httpClient = new HTTPClient("https://jsonplaceholder.typicode.com");

    Todo todo = new Todo();
    todo.Completed = false;
    todo.UserId = 1;
    todo.SetTitle("foo");

    httpClient.Post("todos", todo, OnTodoCreated);

    delete todo;
}

public void OnTodoCreated(HTTPResponse response, any value)
{
    if (response.Status != HTTPStatus_Created) {
        // Failed to create todo
        return;
    }
    if (response.Data == null) {
        // Invalid JSON response
        return;
    }

    Todo todo = view_as<Todo>(response.Data);

    PrintToServer("Todo created with ID %d", todo.Id);
}

 

 


 

76561197963567575.png

Link do komentarza
Udostępnij na innych stronach

Chcesz dodać odpowiedź ? Zaloguj się lub zarejestruj nowe konto.

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to bardzo łatwy proces!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się
 Udostępnij

  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...