Менее чем за 10 минут

Merly.jl — это микровеб-фреймворк, написанный на языке Julia. Он позволяет легко и быстро создавать серверные API-приложения и микросервисы.

Установка

Для установки Мерли нам понадобится только Юлия версии 1.5 или выше и выполнить эту небольшую команду из интерактивной консоли Юлии.

(@v1.5) pkg> add Merly

Если по какой-то причине у вас возникли проблемы с получением последней версии, вы можете использовать эти команды.

using Pkg
Pkg.Registry.add (RegistrySpec (url = 
“https://github.com/JuliaRegistries/General"))
Pkg.update()
Pkg.add (Pkg.PackageSpec (; name = “Merly”, version = “1.0.2”))

Программирование

В этом уроке мы создадим CRUD API для ветеринара, мы определим только для практических целей раздел животных.

Давайте определим информацию, которую нам нужно собрать для каждого животного.

Type
Name

Мы собираемся создать структуру, которая позволит нам создать пользовательский тип под названием Animal.

mutable struct Animal
  type :: String
  name :: String
end

Чтобы хранить наши данные о животных, мы будем использовать словарь, который будет иметь целочисленный ключ в качестве ключа, который будет функционировать как идентификатор для наших данных.

ANIMALS = Dict {Int, Animal} ()

Значение идентификатора необходимо увеличивать каждый раз при его использовании, поэтому мы создадим обертку для целого числа, которая позволит определить переменную как константу.

const NEXT_ID = Ref (0)

Мы также создадим функцию с именем getNextId, которая будет увеличивать значение NEXT_ID на единицу при каждом выполнении.

function getNextId ()
id = NEXT_ID []
NEXT_ID [] + = 1
return id
end

Теперь мы собираемся создать маршрут, который позволит нам зарегистрировать новое животное в нашем приложении. Мы определим маршрут «/createAnimal» с глаголом http POST, функция, связанная с этим маршрутом, получит объект типа json, который будет включать в себя необходимые данные для регистрации нашего животного, а именно тип и имя.

Поскольку мы будем получать эти данные в виде текстовых строк и нам нужно будет преобразовать их в объект JSON, совместимый с Julia, мы определим функцию, позволяющую преобразовать строку в JSON, которую мы назовем: tojson

function tojson (data :: String)
   return JSON.parse (data)
end

И мы добавим его в Merly, чтобы он каждый раз при получении данных с заголовком «application/json» выполнял функцию tojson, для автоматической обработки данных.

formats [“application/json”] = tojson

Итак, мы создаем маршрут с помощью макроса @route, внутри него мы создадим новый идентификатор, мы будем извлекать данные из тела HTTP-запроса, чтобы позже добавить новые данные типа Animal в наш словарь и вернуть новое значение наш объект с соответствующим идентификатором и кодом создания HTTP.

Не забывайте, что мы должны передать данные, определенные в основной программе и которые мы будем использовать в функции, связанной с маршрутом, такие как библиотека JSON, словарь ANIMALS, функция getNextId и структура Animal.

@route POST "/createAnimal" (;JSON=JSON,ANIMALS=ANIMALS,getNextId=getNextId,Animal=Animal) begin
id = getNextId()
ANIMALS[id] = Animal(request.body["type"],request.body["name"])
info=Dict()
  info["id"]=id
  info["type"]= request.body["type"]
  info["name"]= request.body["name"]
  
body = JSON.json(info)HTTP.Response(201
          , HTTP.mkheaders(["Content-Type" => "application/json"])
          ,body= body)
end

Теперь мы собираемся восстановить данные всех животных, зарегистрированных в нашем приложении. Для чего мы определим маршрут «/getAnimals» с HTTP-глаголом GET, который вернет словарь ANIMALS как объект JSON, и чтобы браузер интерпретировал его как таковой, я добавлю заголовок «Content-Type» со значением « приложение /json».

@route GET "/getAnimals" (;JSON=JSON,ANIMALS=ANIMALS) begin
HTTP.Response(200
  ,HTTP.mkheaders(["Content-Type" => "application/json"])
  ,body=JSON.json(ANIMALS))
end

Если сейчас я хочу визуализировать данные одного животного, мне придется сделать это через его ID, поэтому в маршруте я передам это значение, а в приложении укажу через: id, таким образом оно позволит мне получить значение идентификатора благодаря параметрам словаря, принадлежащим структуре запроса. Как только приложение получит идентификатор, значение будет преобразовано в целое число, а данные, сохраненные с этим значением ключа, будут возвращены в виде json. Точно так же в заголовок «Content-Type» будет добавлено значение «application/json».

@route GET "/getAnimal/:id" (;JSON=JSON,ANIMALS=ANIMALS) begin
id = parse(Int,request.params["id"])
HTTP.Response(200
    ,HTTP.mkheaders(["Content-Type" => "application/json"])
    ,body=JSON.json( ANIMALS[id])
  )end

Для обновления данных ранее зарегистрированного животного мы будем использовать HTTP-глагол PUT и маршрут будет «/updateAnimal/:id», так же, как и в предыдущем случае, мы должны указать в маршруте идентификатор значения мы хотим обновить, один раз с преобразованием идентификатора в целое число, мы возьмем новые данные животного из тела запроса и будем использовать их для создания новых данных и присвоения их ранее указанному идентификатору.

@route PUT "/updateAnimal/:id (;JSON=JSON,ANIMALS=ANIMALS,Animal=Animal) begin
id = parse(Int,request.params["id"])
ANIMALS[id] = Animal(request.body["type"],request.body["name"])
HTTP.Response(200)
end

Наконец, чтобы удалить ранее зарегистрированное животное, мы будем использовать URL-адрес «/deleteAnimal/:id» с глаголом HTTP DELETE, который также получит идентификатор животного, которое мы хотим удалить, для которого функция удаления! это нам пригодится.

@route DELETE "/deleteAnimal/:id" (;ANIMALS=ANIMALS) begin
id = parse(Int,request.params["id"])
  delete!(ANIMALS, id)
  HTTP.Response(200)
end

Со всеми определенными маршрутами мы настроим сервер на порт 8086 и IP-адрес 127.0.0.1.

start(host = "127.0.0.1", port = 8086, verbose = true)
$ julia appmerly.jl
[ Info: POST > /createAnimal
[ Info: GET > /getAnimals
[ Info: GET > /getAnimal/:id
[ Info: PUT > /updateAnimal/:id
[ Info: DELETE > /deleteAnimal/:id
[ Info: Listening on: 127.0.0.1:8086

Мы протестируем приложение с помощью api tester. Это результаты.

создатьживотное

получитьживотные

создатьживотное

получитьживотные

получитьживотное/идентификатор

обновитьживотное/идентификатор

получитьживотные

удалитьживотное/идентификатор

получитьживотные

ВЫВОД

Создать приложение, используя Merly в качестве фреймворка, очень просто, так как не только синтаксис библиотеки прост, но и язык Julia предоставляет инструменты и характеристики, облегчающие работу. Короче говоря, это хороший вариант для работы с HTTP-приложениями.

Если в этой статье есть какие-либо ошибки или вы считаете, что можно внести улучшения, сообщите мне об этом в разделе комментариев, я очень ценю это!

Хосуэ Асеведо Мальдонадо — инженер-программист, в настоящее время работает консультантом.

Подключиться в LinkedIn.

Спасибо за участие в сообществе!
Вы можете найти соответствующий контент на каналах YouTube, Twitter, Twitch, Spotify, и т. д., помимо книга Ensamblador X86.

Наконец, если вам понравилась эта статья и вы чувствуете, что узнали что-то ценное, поделитесь ею, чтобы другие тоже могли извлечь из нее уроки.

Спасибо за чтение!