我已经设置了一个非常基本的DataSnap Server Application(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也无法管理它。
答案 0 :(得分:1)
我已经能够确定发生了什么。使用Wireshark和Rawcap(捕获本地环回请求),我可以看到即使浏览器显示有意义的消息:
{"error":"jason is not authorized to perform the requested action."}
它还返回HTTP 500内部服务器错误。但是,有意义的响应文本也会作为此响应的一部分返回,该响应由浏览器显示。
检查Indy HTTP响应,它是一样的;实际的响应代码是500,但我想要显示的文本也被返回。
通过捕获EIdHTTPProtocolException
并访问其ErrorMessage
属性,可以访问此内容。