Блог. Двадцать пять лет Делфи-практики
В этом блоге я буду публиковать ответы на вопросы, которые постоянно приходится повторять на форуме.
Здесь можно это сделать более развернуто и спокойно.
Все, что здесь написано, не является истиной в последней инстанции, скорее, это результат моих размышлений над архитектурой проектов, маленьких и больших, которых я сделал на Делфи более дюжины.
Начав с Делфи-2 двадцать пять лет назад, я прошел все версии, испробовал массу технологий, включая работу с БД, с графикой DirectX, связью с серверами и интернетом, разработку на Андроид и IOS, и многое, многое другое.
________________________________________ ________________________________________ ____
P.S. все, о чем здесь написано, всего лишь измышления из головы.
совпадения с реальными людьми и фактами случайны.
В этом блоге я буду публиковать ответы на вопросы, которые постоянно приходится повторять на форуме.
Здесь можно это сделать более развернуто и спокойно.
Все, что здесь написано, не является истиной в последней инстанции, скорее, это результат моих размышлений над архитектурой проектов, маленьких и больших, которых я сделал на Делфи более дюжины.
Начав с Делфи-2 двадцать пять лет назад, я прошел все версии, испробовал массу технологий, включая работу с БД, с графикой DirectX, связью с серверами и интернетом, разработку на Андроид и IOS, и многое, многое другое.
________________________________________ ________________________________________ ____
P.S. все, о чем здесь написано, всего лишь измышления из головы.
совпадения с реальными людьми и фактами случайны.
Реализуем вызовы HTTP API
Запись от krapotkin размещена 01.10.2023 в 12:54
Показов 3894
Комментарии 0
|
Мотивация В настоящее время на смену родному для делфи клиент-серверному приложению, подключенному намертво к базе данных, пришли те, что получают данные через HTTP запросы к какому-то API. В современных версиях делфи есть библиотека REST API, но к ней иногда возникают вопросики по работоспособности. Чтобы не разбирать чужой сложный код, можно быстро и на коленке написать свою маленькую библиотечку, где будут вызовы к некоему API. Поехали. Общий подход В общем случае все API примерно одинаковы. REST или нет - все равно. Поэтому сначала создадим класс, который решает задачу "вообще", а потом отнаследуем от него другой, который будет обращаться уже к нашему конкретному API. У нас всегда есть базовый адрес и конкретные пути для каждого метода API. Т.е. в класс помещаем поле BaseUrl: string а пути для методов будем добавлять уже при заросе. Также, для идентификации абонента сервер обычно принимает некий токен. Его получают либо раз и навсегда, либо каждый раз мы должны выполнять метод логин и получать его на сессию работы. Но поле Token: String тоже добавляем в класс. Токен чаще всего передается в заголовках запроса, которые имеют вид Name = Value и в делфи есть готовый тип для них в модуле System.Net.URLClient: Кликните здесь для просмотра всего текста
Поэтому в нашем классе будет еще поле Headers : TNameValueArray; и метод, который эти заголовки заполняет.
Хотя в целом обычно все одинаково. Поэтому изначально смело делаем так, и нам редко придется это менять
для тех, кто не очень в курсе про HTTP полный адрес (или URI, как его называют) состоит из нескольких частей (кратко и своими словами. Правильно и полно - например тут https://www.geeksforgeeks.org/components-of-a-url/)
myserver.com - хост. адрес сервера api/v2/orders/2314/item/12 - путь, или собственно URL - ресурс, который мы запрашиваем у сервера обратите внимание, в URL бывают параметры - как тут - заказ 2314, строка 12 ?deleted=1&sort=name&lang=ru - query parameters - дополнительные параметры запроса. Отделяются ? и разделены &. Возвращаемся к теме Для формирования итоговой строки URL мы будем использовать BaseUrl = схема + хост + неизменный кусок для API плюс для каждого метода формируем как остаток URL, так и query params. Т.е. нам нужны поля UrlParams, QueryParams и метод MakeUrl : string; virtual; чтобы собрать потом готовый URL для вызова и то и другое - это обычный TStringList. только первый - просто строки, а второй будет использовать встроенный в StringList функционал Name=Value. JSON В каждый запрос нам нужно передавать JSON. И принимать JSON. И свои объекты упаковывать в JSON и пришедший JSON парсить и создавать по нему объекты. Это называется сериализация и десериализация. В Делфи есть пара независимых друг от друга реализаций библиотек работы с JSON, можно пользоваться ими. Но мне не нравится их синтаксис, поэтому я обычно пользуюсь симпатичноый маленькой и очень удобной библиотекой XSuperObject. Про сериализацию смотрите отдельный пост этого блога. Первый итог Все готово к тому, чтобы представить базовый класс для совершения запросов на сервер и получения результатов Поместим его в отдельный юнит и потом будем использовать где попало. Если б не неrоторые условности, то метод MakeUrl выглядел бы так
можно самостоятельно, но в Делфи есть класс TUri, который сделает все за нас, но к нему надо подкинуть недостающие методы. Чтобы не пихать эти методы прямо в API, я сбросил их в отдельный файл. UUriHelper.pas без объяснения. просто надо положить рядом Кликните здесь для просмотра всего текста
поэтому будет чуть сложнее и MakeUrl переделан под использование FUri Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
в приведенном коде реализован только метод POST, вызовы остальных реализуйте сами по аналогии отличается только GET, куда не передается SrcStream, т.к. у него нет тела запроса. Реализация конкретного API Итак, инструмент у нас теперь есть, давайте посмотрим как его использовать. Делать это нужно в соответствии с документацией на ваш API. Заведем отдельный модуль и класс-наследник общего THttpApi. Этот модуль должен использовать объекты вашей модели данных, предположим, они описаны в модуле MyClasses.pas Предположим, у нас есть API на адресе https://server.com/api/v2/ и токен нам дали при регистрации на сайте - XXX-XXX-YYYY и его нужно помещать в заголовок вида Authorization: Bearer XXX-XXX-YYYY Кликните здесь для просмотра всего текста
теперь разбирая документацию API мы видим метод "добавить заказ" POST /orders/ туда надо передать JSON
если все норм, то у нас есть ResultJson в котором есть поля result и orderId в самой программе мы можем единожды создать наш объект и пользоваться им все время
в коде могут быть неточности, условности и недостача кусков, потому что это не реальный проект, а лишь макет | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии


