Веб-сервис PP.SOM в первую очередь предназначен для разработки систем на базе веб-приложений. Однако, иногда может возникнуть необходимость обратиться к веб-сервису из сборок/форм/модулей настольного приложения. В языке Fore для взаимодействия с различными сетевыми ресурсами посредством POST/GET запросов предназначен класс NetHttpService сборки Net. По умолчанию запросы указываются в SOAP-формате. Если предполагается выполнение Json-запросов, то добавьте заголовок «Content-Type: application/json; charset=utf-8» в коллекцию INetHttpCommand.Headers и свойству INetHttpCommand.OuterBody установите значение True.
Для работы с веб-сервисом:
Создайте экземпляр класса NetHttpService, укажите в свойстве Url адрес веб-сервиса и выполните метод Connect. Правила формирования адреса веб-сервиса представлены подразделе «Подключение к веб-сервису».
Полученный объект, описываемый интерфейсом INetCommand, приведите к интерфейсу INetHttpCommand и задайте настройки для работы с веб-сервисом: Command = NetHttpCommandType.Post;
Сформируйте запрос для выполнения требуемой операции. Описание операций и примеры их использования представлены в подразделе «Операции веб-сервиса»;
Сформированный запрос передайте в метод Start для отправки запроса веб-сервису.
В свойстве Result будет доступен ответ веб-сервиса.
Ниже приведёны примеры подключения к веб-сервису PP.SOM и отправки запросов на подключение и отключение от репозитория. После удачного подключения в консоль среды разработки будут выведены текст запроса, ответа и полученный моникёр, через который осуществляется вся дальнейшая работа с репозиторием. По завершению работы осуществляется отключение от репозитория. Идентификатор описания репозитория, к которому осуществляется подключение, а также пользователь и пароль передаются в параметрах указанных процедур.
Sub TestSOAPRequest(DefinitionID: String; User: String; Password: String);
Var
Service: INetHttpService;
Cmd: INetCommand;
HttpCmd: INetHttpCommand;
Request: Variant;
Response, Moniker: String;
Begin
Service := New NetHttpService.Create;
Service.Url := "http://localhost:9090/axis2/services/PP.SOM.Som";
// Подключение к веб-сервису
Cmd := Service.Connect;
HttpCmd := Cmd As INetHttpCommand;
HttpCmd.Command := NetHttpCommandType.Post;
HttpCmd.AcceptLanguage := "ru";
// Подключение к репозиторию
Request :=
"<OpenMetabase>" +
"<tDef><id>" + DefinitionID + "</id></tDef>" +
"<tCreds><user><id>" + User + "</id></user><pass>" + Password + "</pass></tCreds>" +
"</OpenMetabase>" ;
Cmd.Start(Request);
Response := Cmd.Result As String;
Moniker := Response.SubString(Response.IndexOf("<id>") + 4, Response.IndexOf("</id>") - Response.IndexOf("<id>") - 4);
// Просмотр запроса, ответа и полученного моникёра
ShowText("Request", Request);
ShowText("Response", Response);
ShowText("Moniker", Moniker);
//...
// Дальнейшая работа с репозиторием
//...
// Отключение от репозитория
Request := "<CloseMetabase><tMb><id>" + Moniker + "</id></tMb></CloseMetabase>";
Cmd.Start(Request);
Response := Cmd.Result As String;
// Просмотр запроса, ответа
ShowText("Request", Request);
ShowText("Response", Response);
End Sub TestSOAPRequest;
Sub ShowText(Title: String; Text: String);
Begin
Debug.WriteLine("---" + Title + "---");
Debug.Indent;
Debug.WriteLine(Text);
Debug.Unindent;
End Sub ShowText;
Sub TestJsonRequest(DefinitionID: String; User: String; Password: String);
Var
Service: INetHttpService;
Cmd: INetCommand;
HttpCmd: INetHttpCommand;
Request: Variant;
Response, Moniker: String;
Start, End_: Integer;
Begin
Service := New NetHttpService.Create;
Service.Url := "http://localhost:9090/axis2/services/PP.SOM.Som";
// Подключение к веб-сервису
Cmd := Service.Connect;
HttpCmd := Cmd As INetHttpCommand;
HttpCmd.Command := NetHttpCommandType.Post;
HttpCmd.AcceptLanguage := "ru";
// Заголовок для установки формата отправляемого запроса
HttpCmd.Headers.Add("Content-Type: application/json; charset=utf-8");
// Отмена прикрепления обязательных SOAP-заголовков
HttpCmd.OuterBody := True;
// Подключение к репозиторию
Request := "{""OpenMetabase"":" +
"{""tDef"":{""id"":""" + DefinitionID + """}," +
"""tCreds"":{""user"":{""id"":""" + User + """},""pass"":""" + Password + """},""tArg"":""""}}";
Cmd.Start(Request);
Response := Cmd.Result As String;
Start := Response.IndexOf("""id"": ") + 7;
End_ := Response.IndexOf("!M", Start);
Moniker := Response.SubString(Start, End_ - Start + 2);
// Просмотр запроса, ответа и полученного моникёра
ShowText("Request", Request);
ShowText("Response", Response);
ShowText("Moniker", Moniker);
//...
// Дальнейшая работа с репозиторием
//...
// Отключение от репозитория
Request := "{""CloseMetabase"":{""tMb"":{""id"":""" + Moniker + """}}}";
Cmd.Start(Request);
Response := Cmd.Result As String;
// Просмотр запроса, ответа
ShowText("Request", Request);
ShowText("Response", Response);
End Sub TestJsonRequest;
Sub ShowText(Title: String; Text: String);
Begin
Debug.WriteLine("---" + Title + "---");
Debug.Indent;
Debug.WriteLine(Text);
Debug.Unindent;
End Sub ShowText;
См. также: