使用HTTP客户端

来自RAD Studio
跳转到:航行,搜索

转到在多设备应用程序中使用RTL


RTL提供了两个组件,您可以使用它们向服务器发送HTTP请求并处理其响应:

注:或者,您可以使用THTTP客户端管理HTTP请求。

在设计时配置应用程序

创建HTTP客户端

要创建可用于发送HTTP请求的HTTP客户端,请拖动TNetHTTP客户端来自工具选项板应用程序的窗体或数据模块。这个TNetHTTP客户端不需要任何初始配置。

创建和配置HTTP请求

您还需要删除一个或多个TNetHTTP请求组件添加到表单或数据模块中。

删除新的HTTP请求组件后,双击其客户上的属性对象检查器因此,它的值是您之前删除的HTTP客户端组件。

您可以使用任意数量的请求组件。然而,如果您需要发送几个不同的HTTP请求,更好的方法可能是使用单个HTTP请求组件,并在运行时重新配置该组件以发送每个请求。

发送请求并处理其响应

发送HTTP请求

要发送HTTP请求,必须至少指定以下内容:

HTTP请求方法确定您希望服务器对位于指定URL的资源执行的操作,例如向您发送资源的数据或使用请求中包含的数据更新资源。

如何使用TNetHTTP请求组件取决于要使用的HTTP请求方法。

注:发送请求的函数执行或方法特定的函数,都是阻塞的。也就是说,在服务器响应之前,这些函数不会返回。请参见跟踪响应数据下载进度如下所示。

使用DELETE、GET、HEAD、OPTIONS或TRACE HTTP请求方法发送HTTP请求

以下HTTP请求方法不需要目标资源URL以外的输入数据:

要使用以下任何HTTP请求方法发送HTTP请求,请首先在设计时配置请求:

  1. 配置统一资源定位地址属性和目标资源的URL。
  2. 配置MethodString方法属性,该属性具有要使用的HTTP请求方法的名称。
注:HTTP请求方法名称区分大小写.

然后打电话执行发送您的请求。

使用MERGE、PATCH或PUT HTTP请求方法发送HTTP请求

除了目标资源URL之外,以下HTTP请求方法还需要输入数据:

要使用这些HTTP请求方法发送HTTP请求,请调用其匹配函数,如下表所示。在调用中,指定目标资源的URL作为第一个参数和T流作为你的第二个论点。

HTTP请求方法 TNetHTTPRequest函数
投入 放置
补丁 补丁
合并 合并
通过PUT拼接* 修补程序替代
通过PUT合并* 合并备选方案
*一些HTTP代理不支持最新的标准HTTP请求方法(如PATCH)或非标准HTTP请求方式(如MERGE)。在这些情况下,您可以通过另一种HTTP请求方法代理HTTP请求方法。为此,请求包含指定预期HTTP请求方法的标头。

使用POST HTTP请求方法发送HTTP请求

除了目标资源URL之外邮政HTTP请求方法需要输入数据。

要使用POST HTTP请求方法发送HTTP请求,请调用岗位。在调用中,必须将目标资源的URL指定为第一个参数。其他参数取决于您希望如何提供请求的输入数据:

  • 要发送本地文件的内容,请将该文件的本地路径指定为调用的第二个参数。
  • 要发送流的内容,请提供T流作为您通话的第二个参数。
  • 发送编码为MIME多部分消息遵循HTML 4标准,提供您的实例T多部分表单数据作为你通话的第二个参数。
  • 要发送字符串列表的内容,请提供T管柱作为调用的第二个参数,如果字符串没有用UTF-8编码,请提供T编码作为第四个参数。例如:

德尔福:

NetHTTP请求1.岗位('http://www.example.com/rest/items', 字符串1, , T编码.违约);

C++语言:

NetHTTP请求1->岗位("http://www.example.com/rest/items", 字符串1, 无效的, T编码::违约);

处理HTTP响应

当目标服务器对您的请求发送响应时OnRequestCompleted(请求完成时)HTTP请求组件的事件发生。定义事件处理程序用于此事件从服务器响应中读取数据。如果在请求期间出现错误请求时出错而是发生HTTP请求组件的事件。

的事件处理程序OnRequestCompleted(请求完成时)接收两个参数:

  • 发件人是您的HTTP请求组件。
  • A回应在实现IHTTP响应接口。

您可以从以下位置获取所有响应数据A回应:

管理Cookie

这个允许CookieHTTP客户端组件的属性允许您指定是否接受服务器在响应中发送的cookie。如果允许Cookie真的,HTTP客户端将收到的cookie保存在Cookie管理器.

注:HTTP客户端始终添加其现有cookie请求,无论允许Cookie.

处理重定向

使用处理重定向属性控制HTTP客户端组件如何处理重定向。默认值为真的,这意味着HTTP客户端组件会自动遵循重定向。

使用最大重定向数属性指定允许组件遵循的最大重定向数。如果HTTP客户端组件达到指定的最大重定向数,则会引发类型为的异常ENetHTTPRequestException(ENetHTTP请求异常).

处理响应数据的下载

当HTTP客户端下载对请求的响应时OnReceiveData(接收数据)HTTP请求对象的事件持续发生。为提供事件处理程序OnReceiveData(接收数据)跟踪响应数据的下载进度。事件处理程序接收以下参数:

  • 发件人,这是您的HTTP请求对象。
  • A内容长度,它是响应数据的预期长度(字节数)。
  • A读取计数,它是HTTP客户端到目前为止下载的响应数据的字节数。
  • 中止,这是一个允许您取消下载的布尔参数。

下载完成后,OnReceiveData(接收数据)最后一次发生,并且A内容长度A读取计数都是一样的。OnRequestCompleted(请求完成时)很快就会发生。

跟踪响应数据下载进度

要跟踪下载数据的进度,请使用A内容长度A读取计数在中OnReceive数据事件处理程序。这是一个计算下载数据百分比的示例:

德尔福:

程序 T形1.NetHTTPRequest1接收数据(常数 发件人: TObject(目标);
A内容长度, A读取计数: 国际64; 无功功率,无功功率 中止: 布尔值);
无功功率,无功功率
    下载百分比:双精度;
开始
    如果 A内容长度 > 0 然后
        下载百分比 以下为:=  (A读取计数 / A内容长度) * 100;
    其他的
        //服务器未提供Content-Length标头
结束;

C++语言:

空隙 __快速呼叫 T形1::NetHTTPRequest1接收数据(TObject(目标) * 常数 发件人, __整数64 A内容长度,
     __整数64 A读取计数, 布尔 &中止)
{
    浮动 下载百分比;
    如果 (A内容长度 > 0)
    {
        下载百分比 = ((浮动)A读取计数 / (浮动)A内容长度) * 100英尺;
    }
    其他的
    {
        //服务器未提供Content-Length标头
    }
}

取消下载响应数据

要取消下载响应数据,请更改中止真的在中OnReceiveData(接收数据)事件处理程序。

发送带有自定义标头的请求

HTTP客户端组件和HTTP请求组件都允许您设置自定义标头。您可以指定的自定义标题为:

当你执行请求THTTP客户端。执行HTTP框架的方法将来自HTTP客户端组件的自定义标头与相应的HTTP请求组件相结合,并将这些标头添加到最终请求中。

处理安全连接

HTTP客户端组件支持安全(HTTPS)连接。HTTP框架会自动处理发生的任何证书请求,并在必要时触发相应的事件:

有关处理证书的更多信息,请参阅处理服务器端证书处理客户端证书部分了解更多信息。

处理身份验证和证书

处理HTTP基本访问身份验证

当您向需要的服务器发送HTTP请求时HTTP基本访问身份验证,的OnAuthEvent上发生HTTP客户端对象的错误。要提交访问凭据,请提供此事件的事件处理程序,如果事件处理程序收到第二个参数的值(授权目标)是TAuthTargetType。服务器,填充AUserName(用户名称)A密码用于HTTP访问的用户名和密码变量。例如:

德尔福:

程序 T形1.NetHTTPClient1验证事件(常数 发件人: TObject(目标);
  授权目标: TAuth目标类型; 常数 ARealm公司, AURL公司: 一串;
  无功功率,无功功率 AUserName(用户名称), A密码: 一串; 无功功率,无功功率 中止身份验证: 布尔值;
  无功功率,无功功率 坚持不懈: TAuthPersistence类型);
开始
  如果 授权目标 = TAuth目标类型.服务器 然后
  开始
    AUserName(用户名称) 以下为:= '我的用户名';
    A密码 以下为:= '1234';
  结束;
结束;

C++语言:

空隙 __快速呼叫 T形1::NetHTTPClient1验证事件(TObject(目标) * 常数 发件人,
  TAuth目标类型 授权目标, 常数 Unicode字符串 ARealm公司,
  常数 Unicode字符串 AURL公司, Unicode字符串 &AUserName(用户名称), Unicode字符串 &A密码,
  布尔 &中止身份验证, TAuthPersistence类型 &坚持不懈)
{
    如果 (授权目标 == TAuth目标类型::服务器) {
        AUserName(用户名称) = “我的用户名”;
        A密码 = "1234";
    }
}

事件处理程序还接收需要身份验证的HTTP服务器域(ARealm公司)和请求的目标URL(AURL公司).

要中止HTTP身份验证过程,请更改中止身份验证真的.

在代理后发送请求

当你落后于代理如果需要身份验证,则可以定义代理设置用于身份验证的。此示例演示了如何执行此操作:

德尔福:

网络HTTPClient1.代理设置 以下为:= TProxy设置.创建('192.168.1.1', 8080, '我的用户名', “我的密码”);

C++语言:

TProxy设置  我的代理设置(“192.168.1.1”, 8080, “我的用户名”, “我的密码”, "");
网络HTTPClient1->代理设置 = 我的代理设置;

指定代理设置的另一种方法是提供包含代理相关信息的URL字符串:

德尔福:

网络HTTPClient1.代理设置 以下为:= TProxy设置.创建('http://MyUserName:MyPassword(我的用户名:我的密码)@192.168.1.1:8080');

C++语言:

TProxy设置  我的代理设置("http://MyUserName:MyPassword(我的用户名:我的密码)@192.168.1.1:8080");
网络HTTPClient1->代理设置 = 我的代理设置;

或者,您可以在OnAuth事件事件处理程序。请参阅处理HTTP基本访问身份验证部分,并检查授权目标TAuthTargetType。代理而不是TAuthTargetType。服务器.

使用HTTP客户端处理系统代理设置

下表说明了HTTP客户端如何处理不同平台上的系统代理设置:

站台 行为

窗户

HTTP客户端使用系统代理设置。您可以绕过系统代理设置,也可以为HTTP客户端提供替代代理设置。

要绕过系统代理设置,请为HTTP客户端创建代理设置并指定http://直接作为URL。

macOS操作系统

HTTP客户端始终使用系统代理设置。即使您为HTTP客户端提供了替代代理设置,HTTP客户端也会使用系统代理设置。

网间网操作系统

HTTP客户端始终使用系统代理设置。即使您为HTTP客户端提供了替代代理设置,HTTP客户端也会使用系统代理设置。

安卓

HTTP客户端使用系统代理设置。您不能绕过这些设置,但可以为HTTP客户端提供替代代理设置。

Linux操作系统

HTTP客户端使用系统代理设置。您不能绕过这些设置,但可以为HTTP客户端提供替代代理设置。

注:如果系统没有指定任何代理设置(连接是直接的),这也被视为“设置”。例如,在没有系统代理设置的iOS或macOS上,无法为HTTP客户端提供代理设置。您提供的设置将被忽略,因为使用了系统设置(“无代理”设置)。
收件人:直到RAD Studio 10.4,HTTP客户端库一直在使用NSURL连接API,苹果已经在Mac OS X 10.11和iOS 9上弃用了它。RAD Studio10.4.1引入了对更新版本的支持NSURL会话这两种平台上的API,也解决了macOS上的代理支持问题。

管理用户凭据的存储

TNetHTTP客户端允许您存储用于HTTP或代理身份验证的凭据。每个存储的凭证可以包含用户名、密码、身份验证目标类型、领域和目标URL。

此示例演示如何使用TNetHTTPClient。凭证存储要保存凭据,然后在连接到需要基本身份验证的HTTP服务器时使用该凭据进行身份验证,请执行以下操作:

  1. 创建凭据并将该凭据添加到凭据存储中:

    德尔福:

    网络HTTPClient1.凭证存储.添加凭据(TCredentials存储.T信用证.创建(TAuth目标类型.服务器, “”, “”, '我的用户名', “我的密码”);
    

    C++语言:

    TCredentials存储::T信用证 *我的凭证 = 新的 TCredentials存储::T信用证(TAuth目标类型::服务器, "", "", “我的用户名”, “我的密码”);
    网络HTTPClient1->凭证存储->添加凭据(*我的凭证);
    
  2. 使用保存的凭据。例如,您可以编写OnAuthEvent上事件处理程序,其中您:

    德尔福:

    程序 T形1.NetHTTPClient1验证事件(常数 发件人: TObject(目标);
      授权目标: TAuth目标类型; 常数 ARealm公司, AURL公司: 一串; 无功功率,无功功率 AUserName(用户名称),
      A密码: 一串; 无功功率,无功功率 中止身份验证: 布尔值;
      无功功率,无功功率 坚持不懈: TAuthPersistence类型);
    无功功率,无功功率
        我的凭证: TCredentials存储.T信用证;
    开始
        我的凭证 以下为:= 网络HTTPClient1.凭证存储.FindAccurateCredential(查找准确凭证)(授权目标, “”);
        AUserName(用户名称) 以下为:= 我的凭证.用户名;
        A密码 以下为:= 我的凭证.密码;
    结束;
    

    C++语言:

    空隙 __快速呼叫 TForm2::NetHTTPClient1AuthEvent(NetHTTPClient1AuthEvent)(TObject(目标) * 常数 发件人, TAuth目标类型 授权目标,
      常数 Unicode字符串 ARealm公司, 常数 Unicode字符串 AURL公司,
      Unicode字符串 &AUserName(用户名称), Unicode字符串 &A密码, 布尔 &中止身份验证,
      TAuthPersistence类型 &坚持不懈)
    {
        TCredentials存储::T信用证 我的凭证;
    
        我的凭证 = 网络HTTPClient1->凭证存储->FindAccurateCredential(查找准确凭证)(AnAuthTarget(授权目标), "");
        AUserName(用户名称) = 我的凭证.用户名;
        A密码 = 我的凭证.密码;
    }
    

处理服务器端证书

如果服务器提供SSL证书,但此证书无效,则OnValidateServer证书事件发生。为提供事件处理程序OnValidateServer证书以便您可以检查服务器证书(证书)并确定是否接受服务器证书。如果您接受服务器证书,请更改接受参数到真的.

处理客户端证书

如果服务器需要客户端证书,则OnNeedClientCertificate事件发生。为提供事件处理程序OnNeedClientCertificate以便您可以检查客户端证书列表(A证书列表),并确定要发送到服务器的证书。要从列表中发送给定证书,请更改AnIndex(索引)到中目标证书的索引A证书列表.

注:如果向需要客户端证书的服务器发出的第一个请求的HTTP方法不是HEAD或GET(例如,它是POST),则服务器响应的状态代码为413。始终先发送HEAD或GET请求。使用HEAD请求通常是更好的选择,因为传输的数据更少。

使请求异步

默认情况下,请求是同步的。在请求期间,当您启动请求时,应用程序的执行将停止,并且只有在您从服务器获得响应或请求超时时,才恢复执行。

如果要使请求异步,以便请求不会停止应用程序的执行,则必须启用异步属性或异步属性,具体取决于用于执行请求的组件。

另请参见