2011-02-18 57 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()