2012-05-12 20 views
10

Używam Delphi XE2 do zapisu usługi REST DataSnap. Zauważyłem, że reszta URI w DataSnap muszą ściśle przestrzegać tego formatu (patrz: here):Delphi XE2: Jak zdefiniować niestandardowy identyfikator logowania REST usługi DataSnap?

http://my.site.com/datasnap/rest/URIClassName/URIMethodName[/inputParameter]* 

Znanym przykładem jest metoda próby tworzenia przez kreatora serwera DataSnap:

http://my.site.com/datasnap/rest/TServerMethods1/ReverseString/ABC 

są 2 wspólne sposoby parametry zasilania w URI:

  1. Ścieżka parametr Segment:/TServerMethods1/ReverseString/ABC
  2. Query String p arameter:/TServerMethods1/customers? name = bill

Identyfikator URI parametru Path Segment jest zdecydowanie obsługiwany przez usługę DataSnap REST. Czy obsługa identyfikatorów tekstowych łańcuchów znaków zapytania jest również dostępna w usłudze REST DataSnap?

Mam następujący przykład REST URI i okazało się, że wydaje się niemożliwe, aby pracować z bieżącym DataSnap REST Biblioteka:

  1. /klientów/A1234

    powrót klienta Przedmiotem ID A1234

  2. /customers/A1234.xml

    powrót obiekt klientem ID A1234 w formacie XML

  3. /customers/A1234.json

    powrót klienta przedmiotem ID A1234 w formacie JSON

  4. /customers/A1234.html

    powrót obiekt klientem ID A1234 w formacie html

  5. /klienci? Name = Bill

    zwróci listę klientów, których nazwa zawiera Bill

Odpowiedz

5

nie wiem jak to zrobić za pomocą DataSnap, ale istnieją sposoby wokół niego. Możesz użyć czegoś o nazwie URLRewrite do dobrego wykorzystania, ponieważ zarówno przyjazny adres URI, jak i te wymagane przez DataSnap są łatwe do mapowania.

Dla IIS można użyć (włączyć) modułu URLRewrite, który jest standardem w IIS 7. Więcej informacji można znaleźć na oficjalnej stronie: http://www.iis.net/download/urlrewrite.

Pamiętaj, aby tworzyć reguły dla inboundioutbound URI jest tak, że „wewnętrzny” (DataSnap) URI nie wydostać się na wolność.

Jeśli korzystasz z witryny na serwerze Apache, dostępna jest podobna funkcjonalność, a ja się cieszę, że musisz poprawić plik .htaccess, ale nie mam doświadczenia z Apache, więc mógłbym się mylić.

+1

Byłoby to męczące, gdyby aplikacja Rest miała zostać wdrożona na wielu stronach. –

+0

@ChauCheeYang: Dlaczego? To tylko kilka reguł w web.config. Nie musisz używać Menedżera usług IIS, aby je edytować, możesz po prostu dodać je bezpośrednio do pliku web.config dla witryny lub mieć skrypt instalacyjny, który to zrobi. –

3

Trochę za późno na imprezę, ale tak, możesz użyć parametrów zapytania.

Musisz użyć GetInvocationMetadata.QueryParams

patrz poniższy przykład.

uses DBXPlatform; 

function TServerMethods1.EchoString(Value: string): string; 
var 
    metaData: TDSInvocationMetadata; 
    i: integer; 
begin 
    metaData := GetInvocationMetadata; 
    for i := 0 to Pred(metaData.QueryParams.Count) do 
    begin 
    Result := Result + '<param>' + metaData.QueryParams[i] + '</param>'; 
    end; 
    metaData.ResponseContent := '<xml>' + Result + '</xml>'; 
end; 
+0

Nie używasz TDSInvocationMetadata.Create() ... czy to prawda? –

+0

http://docwiki.embarcadero.com/Libraries/XE2/en/Data.DBXPlatform.GetInvocationMadadata Jest to coś, czego sam nie powinieneś tworzyć, więc tak, to jest poprawne – Patrick