【问题标题】:Delphi XE 5 - THTTPRIO - preemptive connectionDelphi XE 5 - THTTPRIO - 抢先连接
【发布时间】:2020-02-26 11:17:14
【问题描述】:

我有一个使用 DELPHI XE 5 创建的 Web 服务客户端,我使用了 THTTPRIO,导入了 wsdl 并创建了“.pas”文件。 Web 服务的服务器请求抢先式基本身份验证(可与 SoapUI 一起正常工作); 我知道如何使用 THTTPReqResp 的用户名和密码进行身份验证。

rio := THTTPRIO.Create(nil);
HTTPReqResp1 := THTTPReqResp.Create(rio);
HTTPReqResp1.UserName := sUserName;
HTTPReqResp1.Password := sPasswordEncrypted;

但我没有连接到网络服务,因为我不知道如何进行抢占式以及在 Delphi 中是否可能。

谁能帮帮我? :)

【问题讨论】:

  • 如果您想在运行时从 WSDL 文档中动态查找连接信息,您可以设置 WSDLLocation 属性。设置 WSDLLocation 后,从对象检查器的下拉列表中选择 Service 和 Port 属性的值,以完全指定要使用的绑定。
  • 您好 fpiette,感谢您的回答。在我的案例中,我使用的是“RIO.URL := Addr;”不是“ RIO.WSDLLocation := Addr; RIO.Service := defSvc; RIO.Port := defPrt; ”部分当我尝试启动请求时,我收到错误 401(未经授权)。但是我只在 delphi 中收到该消息,当我在“抢占式连接”到 SUOP UI 时它会找到。这就是为什么我尝试对 Delphi 做同样的事情。
  • 为什么要在运行时创建THTTPReqResp 的实例? THTTPRIO 将忽略它,除非您在运行时链接实例:rio.HTTPWebNode := HTTPReqResp1THTTPRIO 在内部创建自己的实例。您可以在设计时通过对象检查器完美地配置其属性(包括UserNamePassword)。要在运行时执行此操作,请使用 rio.HTTPWebNode.UserNamerio.HTTPWebNode.Password

标签: delphi connection preemptive


【解决方案1】:

我刚刚发现如何在 DELPHI 中使用“抢占式”连接。 您必须像这样修改“rio.HTTPWebNode”的 OnBeforePost:

var
rio  : THTTPRIO;
HTTPReqResp1: THTTPReqResp;
uselessObject: TUselessClass;
try
    rio := THTTPRIO.Create(nil);
    uselessObject := TUselessClass.Create();
    rio.HTTPWebNode.GetHTTPReqResp.OnBeforePost := 
    uselessObject.HTTPRIOHTTPWebNode1BeforePost;

通过这个程序:

procedure TUselessClass.HTTPRIOHTTPWebNode1BeforePost(const HTTPReqResp: THTTPReqResp; Data: Pointer);
var
    auth,toEncode: string;
begin
    toEncode := Format('%s:%s',[sUserName,sPasswordEncrypted]);
    auth := 'Authorization: Basic ' + TIdEncoderMIME.EncodeString(toEncode);
    HttpAddRequestHeaders(Data, PChar(auth), Length(auth), HTTP_ADDREQ_FLAG_ADD);
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2011-08-30
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多