Отправка 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. Это должно помочь с вашими потребностями регистрации.