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

Описание

Веб-сервис PP.SOM в первую очередь предназначен для разработки систем на базе веб-приложений. Однако иногда может возникнуть необходимость обратиться к веб-сервису из разрабатываемых на базе настольного приложения сборок/форм/модулей. В языке Fore отсутствуют необходимые классы для работы с веб-сервисами, поэтому организовать работу в данном случае можно только используя связку Fore.NET-Fore. Для отправки запросов и получения ответов от веб-сервиса используются классы HttpWebRequest/HttpWebResponse (.NET Framework, пространства имен System.Net). Ниже приведен пример статической функции на языке Fore.NET, которая позволяет отправлять JSON-запросы и принимать ответы веб-сервиса.

Пример Fore.NET

Public Class SampleWebClient
    Public Shared Function JsonHttpRequest(urlString: string; jsonContent: string): string;
    Var
        response: String;
        wRequest: HttpWebRequest;
        wResponse: HttpWebResponse;
        enc: Encoding;
        bytes: Array Of Byte;
        requestStream, responseStream: Stream;
        reader: StreamReader;
    Begin
        //Создание объекта для отправки запроса веб-сервису и получения ответа
        wRequest := HttpWebRequest.CreateHttp(urlString);
        Try
            bytes := System.Text.Encoding.ASCII.GetBytes(jsonContent);
            //Установка параметров
            wRequest.Method := "POST";
            wRequest.ContentLength := bytes.Length;
            wRequest.ContentType := "application/json;charset=UTF-8";
            //Запись запроса
            requestStream := wRequest.GetRequestStream();
            requestStream.Write(bytes, 0, bytes.Length);
            requestStream.Close();
            //Отправка запроса и получение ответа
            wResponse := wRequest.GetResponse() As HttpWebResponse;
            //Если запрос выполнился успешно, то считываем ответ
            If wResponse.StatusCode = HttpStatusCode.OK Then
                responseStream := wResponse.GetResponseStream();
                reader := New StreamReader(responseStream);
                response := reader.ReadToEnd();
            End If;
            //Закрытие объекта и освобождение ресурсов
            wResponse.Close();
        Except On we: WebException Do
            Begin
                System.Diagnostics.Debug.WriteLine(we.Message)
            End;
        On ex: Exception Do
            Begin
                System.Diagnostics.Debug.WriteLine(ex.Message)
            End;
        Finally
            wResponse.Close();
        End Try;
        Return response;
    End Function;
End Class;

Следующий код отправляет JSON-запрос на подключение к репозиторию и выводит ответ веб-сервиса в консоль среды разработки:

Public Shared Sub Main(Params: StartParams);
Var
    request: string;
    response: string;
Begin
    request := "{ ""OpenMetabase"": { ""tDef"": { ""id"": ""PPREPOSITORY"" } , ""tCreds"": { ""user"": { ""id"": ""pprepository"" } , ""pass"": ""pprepository"" } } }";
    response := JsonHttpRequest("http://localhost:9090/axis2/services/PP.SOM.Som", request);
    System.Diagnostics.Debug.WriteLine(response);
End Sub;

Пример Fore

Для того, чтобы отправить JSON-запрос из кода на Fore воспользуемся ресурсами сборки ForeNet:

Sub TestJsonRequest;
Var
    MB: IMetabase;
    Run: IForeNETRuntime;
    Asm: IForeNETRuntimeAssembly;
    Typ: IForeNETRuntimeType;
    response: Variant;
    url, request: String;
Begin
    url := "http://localhost:9090/axis2/services/PP.SOM.Som";
    request := "{ ""OpenMetabase"": { ""tDef"": { ""id"": ""PPREPOSITORY"" } , ""tCreds"": { ""user"": { ""id"": ""pprepository"" } , ""pass"": ""pprepository"" } } }";
    MB := MetabaseClass.Active;
    Run := ForeNETAssemblyClass.Runtime;
    Asm := Run.Assembly(MB.ItemById("SampleAssembly").Bind As IForeNETAssembly);
    Typ := Asm.Type("SampleAssembly.SampleWebClient");
    response := Typ.InvokeMethod("JsonHttpRequest"Null, url, request);
    Debug.WriteLine(response);
End Sub TestJsonRequest;

См. также:

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