我在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)回应是什么?
答案 0 :(得分:1)
无论您在何处使用代码,都可以通过一种非常灵活的方式来获得您提出的两个问题的答案。请在此处查看%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(location as%String =“”, test As%Integer = 0, reset As%Boolean = 1)as%Status
发出Http'post'请求,用于将数据发送到Web服务器,例如表单的结果,或上传文件。如果此操作正确完成,则对此请求的响应将在HttpResponse中。该位置是要求的网址,例如'/test.html'。这可以包含假定已经URL转义的参数,例如'/test.html?PARAM=%25VALUE'将PARAM设置为%VALUE。 如果测试为1,那么它不会连接到远程计算机,而只会输出它将发送到Web服务器到当前设备的内容,如果测试为2,那么它将在Post之后将响应输出到当前设备。这可用于检查它是否会发送您所期望的内容。这在读取响应后自动调用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()
答案 1 :(得分:0)
我相信您想要答案的答案是在%Net.HttpRequest对象的服务器和位置属性中(例如, HTTPReq.Server 和 HTTPReq.Location )。
对于B),响应信息应该在您的呼叫完成后存储在HttpResponse属性中的%Net.HttpResponse对象中(例如 HTTPReq.HttpResponse )。
我希望这有帮助!
-Derek
(为格式编辑)
答案 2 :(得分:0)
从该代码示例看起来您使用的是Ensemble,而不是直接缓存。
在这种情况下,您应该在使用HTTP出站适配器的业务操作中进行此HTTP调用,而不是在您的业务流程中。
有关HTTP适配器的更多信息,请参阅此链接: http://docs.intersystems.com/ens20102/csp/docbook/DocBook.UI.Page.cls?KEY=EHTP
您还应该了解如何使用Ensemble Message Browser。这应该有助于您的日志记录需求。