Отправка HTTP-запроса с использованием Intersystems Cache - PullRequest
1 голос
/ 18 февраля 2011

У меня есть следующий бизнес-процесс, определенный в производственном процессе установки кэша Intersystems

    /// Makes a call to Merlin based on the message sent to it from the pre-processor
Class sgh.Process.MerlinProcessor Extends Ens.BusinessProcess [ ClassType = persistent, ProcedureBlock ]
{

Property WorkingDirectory As %String;

Property WebServer As %String;

Property CacheServer As %String;

Property Port As %String;

Property Location As %String;

Parameter SETTINGS = "WorkingDirectory,WebServer,Location,Port,CacheServer";

Method OnRequest(pRequest As sgh.Message.MerlinTransmissionRequest, Output pResponse As Ens.Response) As %Status
{

    Set tSC=$$$OK


    Do ##class(sgh.Utils.Debug).LogDebugMsg("Packaging an HTTP request for Saved form "_pRequest.DateTimeSaved)

    Set dateTimeSaved       = pRequest.DateTimeSaved
    Set patientId           = pRequest.PatientId
    Set latestDateTimeSaved = pRequest.LatestDateTimeSaved
    Set formName            = pRequest.FormName
    Set formId              = pRequest.FormId
    Set episodeNumber       = pRequest.EpisodeNumber
    Set sentElectronically  = pRequest.SentElectronically
    Set styleSheet          = pRequest.PrintName

    Do ##class(sgh.Utils.Debug).LogDebugMsg("Creating HTTP Request Class")

    set HTTPReq = ##class(%Net.HttpRequest).%New()

    Set HTTPReq.Server      = ..WebServer
    Set HTTPReq.Port        = ..Port

    do HTTPReq.InsertParam("DateTimeSaved",dateTimeSaved)
    do HTTPReq.InsertParam("HospitalNumber",patientId)
    do HTTPReq.InsertParam("Episode",episodeNumber)
    do HTTPReq.InsertParam("Stylesheet",styleSheet)
    do HTTPReq.InsertParam("Server",..CacheServer)

    Set Status = HTTPReq.Post(..Location,0) Quit:$$$ISERR(tSC)

    Do ##class(sgh.Utils.Debug).LogDebugMsg("Sent the following request: "_Status)

    Quit tSC
}

}

Дело в том, что когда я проверяю значение отладки (которое определяется как глобальное), все, что я получаю, это число'1' - поэтому я понятия не имею, был ли запрос успешным или даже что неправильно (если он этого не сделал)

Что мне нужно сделать, чтобы выяснить

A) Что такоефактический веб-вызов?

B) Каков ответ?

Ответы [ 3 ]

1 голос
/ 11 августа 2011

Существует очень удобный способ получить ответ на два вопроса, которые вы задавали, независимо от того, где вы используете код. Проверьте документацию по объекту% Net.HttpRequest здесь: http://docs.intersystems.com/ens20102/csp/docbook/DocBook.UI.Page.cls?KEY=GNET_http и ссылку на класс здесь: http://docs.intersystems.com/ens20102/csp/documatic/%25CSP.Documatic.cls?APP=1&LIBRARY=ENSLIB&CLASSNAME=%25Net.HttpRequest

Ссылка на класс для метода Post имеет параметр test, который будет выполнять то, что вы ищете. Вот выдержка:

метод Post (местоположение As% String = "", test As% Integer = 0, сброс как% Boolean = 1) как% Status

Выполните Http-запрос 'post', он используется для отправки данных на веб-сервер, таких как результаты формы, или загрузки файла. Если это завершится правильно, ответ на этот запрос будет в HttpResponse. Расположение - это URL для запроса, например, '/Test.html. Это может содержать параметры, которые, как предполагается, уже экранированы URL, например, '/test.html?PARAM=%25VALUE' устанавливает для PARAM значение% VALUE. Если test равен 1, то вместо подключения к удаленной машине он просто выведет то, что отправил бы на веб-сервер, на текущее устройство, если test равен 2, то после публикации он выведет ответ на текущее устройство. . Это можно использовать для проверки того, что он отправит то, что вы ожидаете. Это вызывает сброс автоматически после прочтения ответа, за исключением режима test = 1 или сброса = 0.

Я рекомендую переместить этот код в процедуру тестирования, чтобы правильно просмотреть вывод в терминале. Это будет выглядеть примерно так:

// To view the REQUEST you are sending
Set sc = request.Post("/someserver/servlet/webmethod",1)

// To view the RESPONSE you are receiving
Set sc = request.Post("/someserver/servlet/webmethod",2)

// You could also do something like this to parse your RESPONSE stream
Write request.HttpResponse.Data.Read()
0 голосов
/ 30 мая 2011

Из этого примера кода видно, что вы используете Ensemble, а не кэш-память прямого доступа.

В этом случае вы должны выполнять этот HTTP-вызов в бизнес-операции, использующей исходящий адаптер HTTP, а не в бизнес-процессе.

См. Эту ссылку для получения дополнительной информации об HTTP-адаптерах: http://docs.intersystems.com/ens20102/csp/docbook/DocBook.UI.Page.cls?KEY=EHTP

Вам также следует изучить, как использовать браузер сообщений Ensemble. Это должно помочь с вашими потребностями регистрации.

0 голосов
/ 23 февраля 2011

Я полагаю, что ответ, который вы хотите получить, находится в свойствах сервера и местоположения вашего объекта% Net.HttpRequest (например, HTTPReq.Server и HTTPReq.Location ).

Для B) информация об ответе должна находиться в объекте% Net.HttpResponse, хранящемся в свойстве HttpResponse (например, HTTPReq.HttpResponse ) после завершения вызова.

Надеюсь, это поможет!

-Derek

(отредактировано для форматирования)

...