Как работать с веб-сервисом из Fore?

Описание

Веб-сервис PP.SOM в первую очередь предназначен для разработки систем на базе веб-приложений. Однако, иногда может возникнуть необходимость обратиться к веб-сервису из сборок/форм/модулей настольного приложения. В языке Fore для взаимодействия с различными сетевыми ресурсами посредством POST/GET запросов предназначен класс NetHttpService сборки Net. По умолчанию запросы указываются в SOAP-формате. Если предполагается выполнение Json-запросов, то добавьте заголовок «Content-Type: application/json; charset=utf-8» в коллекцию INetHttpCommand.Headers и свойству INetHttpCommand.OuterBody установите значение True.

Для работы с веб-сервисом:

  1. Создайте экземпляр класса NetHttpService, укажите в свойстве Url адрес веб-сервиса и выполните метод Connect. Правила формирования адреса веб-сервиса представлены подразделе «Подключение к веб-сервису».

  2. Полученный объект, описываемый интерфейсом INetCommand, приведите к интерфейсу INetHttpCommand и задайте настройки для работы с веб-сервисом: Command = NetHttpCommandType.Post;

  3. Сформируйте запрос для выполнения требуемой операции. Описание операций и примеры их использования представлены в подразделе «Операции веб-сервиса»;

  4. Сформированный запрос передайте в метод Start для отправки запроса веб-сервису.

  5. В свойстве 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;

См. также:

Вопросы и ответы