1

Intersystems Cache インストール上のプロダクション内で次のビジネス プロセスを定義しています。

    /// 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) 実際に行われている Web コールは何ですか?

B) 応答は何ですか?

4

3 に答える 3

1

コードをどこで使用しているかに関係なく、あなたが尋ねた 2 つの質問への回答を得る非常に巧妙な方法があります。%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 というパラメーターがあり、探していることを実行します。抜粋は次のとおりです。

method 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 の後に現在のデバイスへの応答を出力します。これは、期待どおりに送信されることを確認するために使用できます。これは、test=1 モードまたは reset=0 の場合を除いて、応答を読み取った後に自動的に Reset を呼び出します。

このコードをテスト ルーチンに移動して、ターミナルで出力を適切に表示することをお勧めします。次のようになります。

// 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 に答える