1

我在跨系统缓存安装的生产中定义了以下业务流程

    /// 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) 反应是什么?

4

3 回答 3

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 中。位置是要请求的 url,例如“/test.html”。这可以包含假定已被 URL 转义的参数,例如 '/test.html?PARAM=%25VALUE' 将 PARAM 设置为 %VALUE。如果 test 为 1,那么它不会连接到远程机器,而是将发送到 Web 服务器的内容输出到当前设备,如果 test 为 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()
于 2011-08-11T17:27:40.200 回答
0

我相信您想要 A) 的答案在 %Net.HttpRequest 对象的 Server 和 Location 属性中(例如HTTPReq.ServerHTTPReq.Location)。

对于 B),响应信息应在调用完成后存储在 HttpResponse 属性(例如HTTPReq.HttpResponse )中的 %Net.HttpResponse 对象中。

我希望这有帮助!

-德里克

(编辑格式化)

于 2011-02-23T17:03:04.977 回答
0

从该代码示例看来,您使用的是 Ensemble,而不是直接缓存。

在这种情况下,您应该在使用 HTTP 出站适配器的业务操作中执行此 HTTP 调用,而不是在您的业务流程中。

有关 HTTP 适配器的更多信息,请参阅此链接: http ://docs.intersystems.com/ens20102/csp/docbook/DocBook.UI.Page.cls?KEY=EHTP

您还应该了解如何使用 Ensemble 消息浏览器。这应该有助于满足您的日志记录需求。

于 2011-05-29T23:44:46.033 回答