2012-05-12 36 views
10

Tôi đang sử dụng Delphi XE2 để viết dịch vụ REST DataSnap. Tôi nhận thấy rằng REST URI trong DataSnap phải đúng theo định dạng này (tham khảo here):Delphi XE2: Làm thế nào để xác định DataSnap REST URI tùy chỉnh?

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

Một ví dụ nổi tiếng là phương pháp mẫu tạo bởi DataSnap thuật sĩ máy chủ:

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

Có 2 cách phổ biến để thông số cung cấp trong URI: tham số Segment

  1. Đường dẫn:/TServerMethods1/ReverseString/ABC
  2. Query string p tham số:/TServerMethods1/customers? name = bill

Thông số Phân đoạn đường dẫn URI chắc chắn được hỗ trợ bởi DataSnap REST. Các tham số chuỗi truy vấn URI có hỗ trợ trong DataSnap REST không?

Tôi có theo gương REST của URI và tìm thấy nó dường như không thể làm cho nó làm việc với hiện tại thư viện DataSnap REST:

  1. /khách hàng/A1234

    trở lại của khách hàng đối tượng của ID A1234

  2. /customers/A1234.xml

    .210

    trở lại đối tượng khách hàng của ID A1234 ở định dạng XML

  3. /customers/A1234.json

    trở lại của khách hàng đối tượng của ID A1234 ở định dạng json

  4. /customers/A1234.html

    trả lại đối tượng khách hàng của ID A1234 ở định dạng html

  5. tên /khách hàng? = Bill

    trở lại một danh sách các khách hàng có tên chứa Bill

Trả lời

5

Tôi không biết làm thế nào để làm điều đó bằng DataSnap, nhưng có những cách xung quanh nó. Bạn có thể đặt một cái gì đó gọi là URLRewrite để sử dụng tốt cho điều này vì cả URI thân thiện của bạn và những cái được yêu cầu bởi DataSnap có thể dễ dàng điều chỉnh được.

Đối với IIS, bạn có thể sử dụng (bật) mô-đun URLRewrite tiêu chuẩn trong IIS 7. Thông tin thêm có thể tìm thấy trên trang web chính thức: http://www.iis.net/download/urlrewrite.

Đảm bảo tạo quy tắc cho inboundoutbound URI sao cho URI "nội bộ" (Datasnap) không thoát ra ngoài tự nhiên.

Nếu bạn đang chạy trang web trên Apache, chức năng tương tự có sẵn, và tôi mỏng bạn cần sửa đổi tệp .htaccess, nhưng tôi không có kinh nghiệm với Apache để tôi có thể sai.

+1

Điều đó sẽ tẻ nhạt nếu Rest APP sẽ triển khai trên nhiều trang web. –

+0

@ChauCheeYang: Tại sao? Nó chỉ là một vài quy tắc trong web.config. Bạn không cần phải sử dụng trình quản lý IIS để chỉnh sửa chúng, bạn có thể chỉ cần thêm chúng thẳng vào web.config cho trang web hoặc có một kịch bản cài đặt làm điều đó cho bạn. –

3

Một chút muộn cho bữa tiệc, nhưng có bạn có thể sử dụng tham số truy vấn.

Bạn phải sử dụng GetInvocationMetadata.QueryParams

xem ví dụ bên dưới.

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

Bạn không sử dụng TDSInvocationMetadata.Create() ... có đúng không? –

+0

http://docwiki.embarcadero.com/Libraries/XE2/en/Data.DBXPlatform.GetInvocationMetadata Đó là điều mà bản thân bạn không nên tạo ra, vì vậy, có đúng – Patrick

Các vấn đề liên quan