【发布时间】:2015-02-16 14:57:06
【问题描述】:
我已经建立了一个非常基本的 DataSnap 服务器应用程序 (Delphi XE3),其中包含 2 个示例方法,EchoString 和 ReverseString。我添加了身份验证,因此只有调用该方法的用户称为“标准”时,他们才能访问 ReverseString 方法。
procedure TServerContainer1.DSAuthenticationManager1UserAuthenticate(
Sender: TObject; const Protocol, Context, User, Password: string;
var valid: Boolean; UserRoles: TStrings);
begin
valid := (User <> '');
if (SameText(User, 'standard') = True) then
begin
UserRoles.Add('standard');
end;
end;
type
TServerMethods1 = class(TDSServerModule)
private
{ Private declarations }
public
{ Public declarations }
function EchoString(Value: string): string;
[TRoleAuth('standard')]
function ReverseString(Value: string): string;
end;
如果我直接从浏览器调用此方法,例如
http://localhost:8080/datasnap/rest/TServerMethods1/ReverseString/TestFromBrowser
然后我得到预期的响应(在浏览器的默认登录提示之后,我输入了一个无效的用户,例如 Jason):
{"error":"jason is not authorized to perform the requested action."}
但是,如果我使用 Indy (TIdHTTP) 从 Delphi 客户端应用程序调用它:
IdHTTP1.Request.BasicAuthentication := True;
IdHTTP1.Request.Username := 'jason';
IdHTTP1.Request.Password := 'jason';
Label2.Caption := IdHTTP1.Get('http://localhost:8080/datasnap/rest/TServerMethods1/ReverseString/TestFromDelphi');
我收到以下回复:
HTTP/1.1 500 Internal Server Error
如何避免错误并收到与浏览器中相同的 RESTful 响应?我一直在试图弄清楚如何查看浏览器发送的 HTTP 请求与 Indy 发送的 HTTP 请求,但没有管理它,即使使用 Ethereal。
【问题讨论】:
-
要捕获请求和响应,您可以使用 Fiddler 2 作为 HTTP 代理
-
谢谢 mjn 我去看看。
-
或 Wireshark(Ethereal 的继任者),因为连接不使用 SSL。如果您使用 Fiddler,则必须相应地配置
TIdHTTP.ProxyParams属性,以便TIdHTTP将连接到 Fiddler。 -
DataSnap 服务器支持哪些 HTTP 身份验证方案?如果不使用其他身份验证,
BasicAuthentication := True允许TIdHTTP回退到BASIC方案。TIdHTTP.OnSelectAuthorization事件的AuthInfo参数中报告了哪些值?这将告诉您服务器支持哪些方案(如果您在 Wireshark/Fiddler 中看不到它)。TIdHTTP使用插件架构进行 HTTP 身份验证,因此请确保已将相关的IdAuthentication...单元添加到您要启用的每个方案的uses子句中。 -
感谢 Remy,将进一步了解。据我所知,Datasnap 仅支持基本身份验证,这对于我需要的目的来说很好。