Отправка HTTP-запроса с использованием Intersystems Cache

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

    /// 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" - поэтому я понятия не имею, был ли запрос успешным или даже что неправильным (если он этого не сделал)

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

А) Каков фактический веб-звонок?

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

3 ответа

Существует очень удобный способ получить ответ на два вопроса, которые вы задали, независимо от того, где вы используете код. Проверьте документацию по объекту%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 = "", тестирование As %Integer = 0, сброс As %Boolean = 1) как%Status

Выполните Http-запрос 'post', он используется для отправки данных на веб-сервер, таких как результаты формы, или загрузки файла. Если это завершится правильно, ответ на этот запрос будет в HttpResponse. Расположение - это URL для запроса, например, "/test.html". Это может содержать параметры, которые, как предполагается, уже экранированы URL, например, '/test.html?PARAM=%25VALUE' устанавливает PARAM в%VALUE. Если test равен 1, то вместо подключения к удаленной машине он просто выведет то, что отправил бы на веб-сервер на текущее устройство, если test равен 2, то он выведет ответ на текущее устройство после публикации. Это может быть использовано для проверки того, что он отправит то, что вы ожидаете. Это вызывает Reset автоматически после прочтения ответа, за исключением режима test=1 или, если reset=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()

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

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

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

-Derek

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

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

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

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

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

Другие вопросы по тегам