0

Delphi XE2 Update 4 Indy 10 を使用しています

URI から取得した変数とのみ対話する従来の Http Get 要求に応答する idHttpServer で実装された Web サービスがあります。

このWebサーバーには、ローカルエリアネットワークなどの他の多くの機能が既に組み込まれているため、新しいプラットフォームに移行するよりも優れたものにすることを検討しています.

同時アクセス数は非常に少なく、一度に最大 5 つです。Web サービスは、SQL サーバーからデータを取得し、JSON で応答します。

このサーバーが提供するサービスを、記述して検索できるように書き直したいと思います。DCOM Iunknown および Idispatch 機能とほとんど同じです。WSDL のような完全に実装された公開言語である必要はありません。

私にとって、アーキテクチャの RESTful スタイルは、SOAP に関連するものよりも私が持っているものに近いものです。

datasnap には Indy コア オプションがあり、RESTful を実行できることを少し読みましたが、Apache や IIS を使用したくなく、通常の Windows アプリケーションになりたいと考えています。DataSnap についてあまりにも多くの悪口を耳にしました...

私は AtomPub と RSDL について読んだことがありますが、他の人については知りませんが、それを使い始めるには Delphi にいくつかのコードが必要です。

私の質問: idHttpServer サーバーでコンポーネント/サンプルをすぐに使い始めるには、どの記述言語を使用すればよいですか?

4

1 に答える 1

2

サービスの記述言語は、Delphiinterface自体である場合があります。公開する必要がないため、安全で簡単なソリューションになります。

あなたのリクエストを考慮して:

このサーバーが提供するサービスを、記述して検索できるように書き直したいと思います。DCOM Iunknown および Idispatch 機能とほとんど同じです。WSDL のような完全に実装された公開言語である必要はありません。

サービスの公開と利用には、オープン ソースのmORMot インターフェイス ベースのサービスを使用することを検討してください。

彼らは JSON over HTTP と REST を使用しており、ほとんどすべてが自動化されています。サービス コントラクトとして使用されるinterfaceプレーンなs でサービスを定義するだけで済みます。

type
  ICalculator = interface(IInvokable)
    ['{9A60C8ED-CEB2-4E09-87D4-4A16F496E5FE}']
    /// add two signed 32 bit integers
    function Add(n1,n2: integer): integer;
  end;

次に、サーバー側で、それを通常の Delphi クラスとして実装します

type
  TServiceCalculator = class(TInterfacedObject, ICalculator)
  public
    function Add(n1,n2: integer): integer;
  end;

function TServiceCalculator.Add(n1, n2: integer): integer;
begin
  result := n1+n2;
end;

 Server.ServiceRegister(TServiceCalculator,[TypeInfo(ICalculator)],sicShared);

また、ラッパーを生成する必要なく、クライアント側でサービスを使用します。

var I: ICalculator;
begin
  if Client.Services['Calculator'].Get(I)) then
    result := I.Add(10,20);
end;

mORMotサーバーは設計上スタンドアロンであり (IIS や Apache は必要ありません)、アプリケーションまたはサービスとして実行できます。セキュリティ、認証、セッション処理などの追加機能があり、かなり優れたパフォーマンスを発揮します. Win32 および Win64 プラットフォームを対象とした、Delphi 6 から XE4 までの作業。

PS:

疑似メソッドを設定TServiceContainerServer.PublishSignature := trueして使用して、単純な JSON 署名を取得することもできます。_signature_

[
    {
    "contract":"Calculator",
    "implementation":"shared",
    "methods":
        [
            {
            "method":"Add",
            "arguments":
                [
                    {"argument":"Self","direction":"in","type":"self"},
                    {"argument":"n1","direction":"in","type":"integer"},
                    {"argument":"n2","direction":"in","type":"integer"},
                    {"argument":"Result","direction":"out","type":"integer"}
                ]
            }
        ]
    }
]
于 2013-09-09T07:05:32.973 に答える