内部服务器使用Indy调用Datasnap服务器时出错

时间:2015-02-16 14:57:07

标签: delphi indy datasnap

我已经设置了一个非常基本的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也无法管理它。

1 个答案:

答案 0 :(得分:1)

我已经能够确定发生了什么。使用Wireshark和Rawcap(捕获本地环回请求),我可以看到即使浏览器显示有意义的消息:

{"error":"jason is not authorized to perform the requested action."}

它还返回HTTP 500内部服务器错误。但是,有意义的响应文本也会作为此响应的一部分返回,该响应由浏览器显示。

Response from Browser

检查Indy HTTP响应,它是一样的;实际的响应代码是500,但我想要显示的文本也被返回。

enter image description here

通过捕获EIdHTTPProtocolException并访问其ErrorMessage属性,可以访问此内容。