2011-02-18 68 views
1

我有一个InterSystems的缓存安装在生产中定义的以下业务流程发送使用InterSystems的缓存中的HTTP请求

/// 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,这意味着方法调用是成功的(它本质上是1 = $$$ OK或0 =不正确的布尔属性。 – mccrackend 2012-02-03 20:46:33

回答

0

我相信你要一个答案)是在您的%Net.HttpRequest对象的服务器和位置属性(例如,HTTPReq.ServerHTTPReq.Location)。

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

我希望这有助于!

-Derek

(编辑格式化)

0

从它看起来像你使用Ensemble,而不是直线上升缓存代码示例。

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

查看HTTP适配器此链接的详细信息: http://docs.intersystems.com/ens20102/csp/docbook/DocBook.UI.Page.cls?KEY=EHTP

你也应该考虑如何使用合奏消息浏览器。这应该有助于您的日志记录需求。

+0

谢谢 - 最终得到的应用程序使用WebBrowser工作,这不是一个完美的远景,但应该可以,直到我们能够使用ITK,而使用CDA的实际上可以让我们处于不需要进行HTML调用的位置。 – 2011-08-13 00:17:06

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的参数,它将执行您正在查找的内容。这里的摘录:

方法后(位置如图%字符串= “”,测试作为%整数= 0,复位作为%布尔= 1)%状态

版本中的HTTP 'POST'请求,这用于将数据发送到Web服务器,如表单的结果或上载文件。如果这个正确完成,对这个请求的响应将在HttpResponse中。位置是要请求的网址,例如'/test.html'。这可以包含假定已经被URL转义的参数,例如, '/test.html?PARAM=%25VALUE'将PARAM设置为%VALUE。 如果test为1,那么不是连接到远程机器,而是只输出将它发送到Web服务器的内容到当前设备,如果test为2,则它会在Post之后将响应输出到当前设备。这可以用来检查它会发送你所期望的。除非在测试= 1模式或复位= 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()