使用Intersystems Cache发送HTTP请求

时间:2011-02-18 16:59:45

标签: caching httprequest intersystems intersystems-ensemble

我在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 个答案:

答案 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。这应该有助于您的日志记录需求。