



Сейчас онлайн на сайте: 18
Недавние пользователи посетившие сайт:
Zerf,

![]() |
Автор → Happy-Piils1
в новости → Плагин WFTP для сервера csgo |
![]() |
Автор → credr1xx
в новости → Плагин Приветствие игрока для ... |
![]() |
Автор → RegWord
в новости → Плагин AgentsChooser для сервера csgo |
![]() |
Автор → nikita866371
в новости → Готовый приватный [Shop] Custom Weapon ... |
![]() |
Автор → BoomkaKot233
в новости → Плагин Skins Frags для сервера |



Автор: Ginek22 от 2-11-2020, 10:47

Ещё одно расширение для работы с HTTP, но заточенное под работу с JSON REST API. Оно поддерживает HTTPS и gzip, и представляет функционал в виде методмапов (methodmaps) для работы с JSON объектами и массивами.
Примеры:
1.JSON
Создание JSON-объекта
PHP:
JSONObject someObject = new JSONObject();
someObject.SetBool("someBool", false);
someObject.SetFloat("someFloat", 1.0);
someObject.SetInt("someInt", 2);
someObject.SetString("someString", "three");
someObject.SetNull("someNull");
Убедитесь перед освобождением памяти от самого JSON-объекта, что Вы освободили память от всех вложенных JSON-объектов и массивов.
Создание JSON-массива
PHP:
JSONArray someArray = new JSONArray();
someArray.PushBool(false);
someArray.PushFloat(1.0);
someArray.PushInt(2);
someArray.PushString("three");
someArray.PushNull();
Вы так же можете использовать Set*() методы, если Вам надо установить для конкретных индексов значения.
Вложение массива в JSON-объекте
PHP:
someObject.Set("someArray", someArray);
JSONArray otherArray = view_as<JSONArray>(someObject.Get("someArray"));
Get() создаёт новый Handle, так что не забудьте закрыть его, когда закончите работать с ним.
Экспорт, импорт из файлов или строк
PHP:
// Экспорт
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);
Если Вы хотите отформатировать итоговый JSON, см. флаги экспорта в самом верху инклюды json.inc
2. HTTP
Установка заголовка запроса
PHP:
#include <sourcemod>
#include <ripext>
HTTPClient httpClient;
public void OnPluginStart()
{
httpClient = new HTTPClient("https://jsonplaceholder.typicode.com");
httpClient.SetHeader("Authorization", "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==");
}
Получение предмета
PHP:
#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);
}
Получение коллекции предметов (массива)
PHP:
#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;
}
}
Создание предмета
PHP:
#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);
}
Обновление предмета
PHP:
#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);
}
Удаление предмета
PHP:
#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
3. Расширение методмапов
Так же, Вы можете написать свой методмап, наследуясь от JSONObject. Это сделает Ваш код чище при чтении и установке значений в JSON.
plugin.inc
PHP:
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
PHP:
#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;
}
Требования
SourceMod 1.8 или выше
Установка
Скачать архив с расширением.
Распаковать архив.
Загрузить распакованные файлы на сервер, соблюдая структуру.
История обновлений:
Чтобы скачать файл пройдите пожалуйста регистрацию, или войдите под своим логином!
Возникли проблемы? Обратитесь на наш Форум.
Новость отредактировал: Ginek22 - 2-11-2020, 10:47
Причина: Обновлен 02.11.20