Delphi:如何创建到使用 DelphiMVCFramework 创建的 RESTful 服务器的有状态连接?
Posted
技术标签:
【中文标题】Delphi:如何创建到使用 DelphiMVCFramework 创建的 RESTful 服务器的有状态连接?【英文标题】:Delphi: How to create a stateful connection to the RESTful server created using DelphiMVCFramework? 【发布时间】:2021-05-23 13:24:53 【问题描述】:我使用 DelphiMVCFrameWork 3.2.1 为我的移动应用程序构建 RESTful 服务器。
为了获取数据,我总是使用基本身份验证。我每次都发送用户名和密码(例如):
procedure TDM.getGroupsFromServer;
var
Http: TIdHTTP;
ReqStr:string;
begin
try
Http := TIdHTTP.Create(nil);
Http.ReadTimeout := 10000;
Http.Request.ContentType := 'application/json';
Http.Request.CharSet := 'utf-8';
HTTP.Request.Accept:= '*/*';
Http.Request.BasicAuthentication:= true;//<---------
Http.Request.Username := DM.username;//<---------
Http.Request.Password := DM.password;//<---------
ReqStr:=Http.Get('http://'+SERVER_IP+':8080/api/groups');
groupsJSON:=ReqStr;
dsGroups.LoadFromJSONArrayString(ReqStr);
dsGroups.First;
finally
Http.Free;
end;
end;
是否有任何 login 方法,然后我执行我的请求,最后我调用 logout 来终止连接?
用户登录:通过发送用户名和密码 用户执行 CRUD 操作(不每次调用都发送用户和密码) 发生用户注销/连接超时提前致谢
【问题讨论】:
我不明白你的问题。 REST 的全部意义在于它是无状态的,询问如何使其有状态与 REST 架构相矛盾。如果您使用基本身份验证,则每次都需要发送用户名和密码。您可以在blog.restcase.com/restful-api-authentication-basics 找到有关各种身份验证方法的更多信息 你需要的是一个会话。从文档来看,DelphiMVCFrameWork 似乎支持会话。 @DalijaPrasnikar 你知道“REST”这个词经常被误用。我们在这里只讨论 Web 服务。 @Olivier 我想我从来没有遇到过这种滥用。当然,这种滥用是可能的。如果术语在这里真的被滥用,那么问题应该改写为状态 Web 服务,而不是 REST,因为 REST 有非常具体的定义,并且这种问题在更频繁的语言标签中会因为不清楚而被关闭。 【参考方案1】:如果您不想在每个请求中发送合法的用户代码/密码,那么您必须发送 cookie。该 cookie(限时)由服务器代码生成并存储在某处(数据库或内存中),将由具有用户代码/密码的第一个请求返回。
对于以后的请求,客户端将 cookie 与请求数据一起发送。服务器必须检查 cookie 并在 cookie 有效时授予访问权限。
当然,cookie 必须对于用户代码和原始 IP 是唯一的,以便所有请求都可以与给定计算机上的给定客户端相关联,以便进行检查以验证客户端是否具有该特定客户端所需的访问权限请求。
根据框架功能(在您的情况下为 DelphiMVCFrameWork),cookie 可以是实际的 HTTP cookie,也可以是简单的数据字段。只要 cookie 从客户端传输到服务器进行验证,这并不重要。
【讨论】:
以上是关于Delphi:如何创建到使用 DelphiMVCFramework 创建的 RESTful 服务器的有状态连接?的主要内容,如果未能解决你的问题,请参考以下文章