Delphi 实现http请求

目录

1.http请求头了解

2.http调用

2.1IdHttp

2.1.1初始化

2.1.2post方法

2.1.3实际使用

2.2nethttpclient

2.2.1初始化

2.1.2post方法

2.2.3实际使用


旧项目维护时发现使用的是TIdHttp,查阅资料发现目前都是使用TNetHTTPClient。他们之间的不同:

 1. nethttpclient支持阻塞和异步模式,idhttp仅支持阻塞模式
 2. nethttpclient可以支持https无需带dll,idhttp需要openssl的几个dll才可以实现
 3. idhttp要手动转码,nethttpclient不需要

1.http请求头了解

在把idhttp改成nethttpclient过程中,碰到一些参数了解不全面,故此来整理下请求头包含哪些,进行深入了解和熟悉。

HTTP Request Header 请求头,这里以百度的请求头为例进行分析

Accept:客户端可以接收服务器返回的类型,例如:text/html,如果是【/】表示接收所有类型。

Accett-Encoding:客户端支持可以压缩的编码,通常指压缩方法,例如gzip

Accept-Language:客户端申明自己接收的语言,例如:zh-CN

Accept-Charset:浏览器可以接受的字符编码集。例如:utf-8

Connection:是否需要持久连接,cloes表示关闭,keep-alive表示连接。

Host:客户端请求资源的Internet主机和端口号,例如:www.baidu.com

Referer:先前网页的网址,即来路。

User-Agent:客户端使用的操作系统和浏览器的名称和版本。
例如:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36

Cache-Control:指定请求和响应遵循的缓存机制,是单向的(请求设置了响应不一定有)。
例如:private: 默认,响应只能够作为私有的缓存,不能再用户间共享
public:响应会被缓存,并且在多用户间共享。

Content-Type:客户端告诉服务器实际发送数据的类型。例如:application/x-www-form-urlencoded

2.http调用

这里采用idhttp和nethttpcilent来进行分别展示。

2.1IdHttp

2.1.1初始化

procedure TSeverSession.initIdHttp(http: TIdHttp);
var
  strs: TStringList;
begin
  with http do
  begin
    ProtocolVersion := pv1_1;
    AllowCookies := True;
    Request.Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
    Request.UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.63';
    Request.ContentType := 'application/x-www-form-urlencoded';
    Request.AcceptLanguage := 'zh-CN,zh;q=0.8';
    Request.AcceptCharSet := 'utf-8';
    HTTPOptions := [hoKeepOrigProtocol, hoInProcessAuth];
    Request.CharSet := 'utf-8';
    Request.CustomHeaders.UnfoldLines := True;
    Request.CustomHeaders.FoldLines := false;
    //增加系统鉴权
    Request.CustomHeaders.Values['Authorization'] := Concat('Bearer ', self.FSessionToken);
  end;
end;

2.1.2post方法

// 发送post请求的方法
function TSeverSession.postRequest(url: string; param: TStringList): string;
var
  http: TIdHttp;
  respStream: TMemoryStream;
  strStream: TStringStream;
  res: string;
  s: string;
  ret: IHTTPResponse;
begin
  http := TIdHttp.Create(nil);
  respStream := TMemoryStream.Create;
  strStream := TStringStream.Create('', TEncoding.UTF8);
  self.initIdHttp(http);
  try
    http.Post(url, param, strStream);
    log4me.log4error('【ServerSession】[postRequest]返回值:' + ret.GetStatusCode.ToString);
    if http.ResponseCode <> 200 then
    begin
      log4me.log4error('【ServerSession】[postRequest]与服务器连接失败');
      result := '';
      exit;
    end;
    res := strStream.DataString;
    result := res;
  finally
    respStream.Free;
    strStream.Free;
    http.Free;
  end;
end;

2.1.3实际使用

这是一个登陆接口,账户account是一个中文字符的传输,使用idhttp的时候涉及转码。

function TSeverSession.Login(accountName: string; password: string): boolean;
var
  param: TStringList;
  res: string;
  jsonObject: TJSONObject;
  userObject: TJSONObject;
  msg: string;
  i: Integer;
begin
  SessionToken := '';
  param := TStringList.Create;
  jsonObject := nil;
  try
    param.Add('username=' + HttpEncode(AnsiToUtf8(accountName)));
    param.Add('password=' + password);
    log4me.log4info('【ServerSession】[Login]:向【/auth】发送请求——[' + HttpDecode(param.GetText) + ']');
    res := postRequest(getServerUrl() + '/auth', param);
    log4me.log4info('【ServerSession】[Login]:后端返回结果res——[' + res + ']');
end;

2.2nethttpclient

2.2.1初始化

{ TNetHTTPClient初始化http,默认追加表头、类型等信息 }
procedure TSeverSession.initHttp(http: TNetHTTPClient);
var
  strs: TStringList;
begin
  with http do
  begin
    //设置连接超时时间
    ConnectionTimeout := 1000;
    //设置响应超时时间
    ResponseTimeout := 2000;
    AllowCookies := True;
    Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
    UserAgent := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36 Edg/89.0.774.63';
    ContentType := 'application/x-www-form-urlencoded';
    AcceptLanguage := 'zh-CN,zh;q=0.8';
    AcceptCharSet := 'utf-8';
    //增加系统鉴权
    CustomHeaders['Authorization'] := Concat('Bearer ', self.FSessionToken);
  end;
end;

2.1.2post方法

// 发送post请求的方法
function TSeverSession.netPostRequest(url: string; param: TStringList): string;
var
  nethttp: TNetHTTPClient;
  respStream: TMemoryStream;
  strStream: TStringStream;
  res: string;
  s: string;
  ret: IHTTPResponse;
begin
  nethttp := TNetHTTPClient.Create(nil);
  respStream := TMemoryStream.Create;
  strStream := TStringStream.Create('', TEncoding.UTF8);
  self.initHttp(nethttp);
  try
    nethttp.Post(url, param, strStream);
    log4me.log4info('【ServerSession】[netPostRequest]返回值:' + ret.GetStatusCode.ToString);
    if ret.GetStatusCode <> 200 then
    begin
      log4me.log4error('【ServerSession】[netPostRequest]与服务器连接失败');
      result := '';
      exit;
    end;
    res := strStream.DataString;
    result := res;
  finally
    respStream.Free;
    strStream.Free;
    nethttp.Free;
  end;
end;

2.2.3实际使用

这里可以看到http请求就不需要转码了。

function TSeverSession.Login(accountName: string; password: string): boolean;
var
  param: TStringList;
  res: string;
  jsonObject: TJSONObject;
  userObject: TJSONObject;
  msg: string;
  i: Integer;
begin
  SessionToken := '';
  param := TStringList.Create;
  jsonObject := nil;
  try
    param.Add('username=' + accountName);
    param.Add('password=' + password);
    log4me.log4info('【ServerSession】[Login]:向【/auth】发送请求——[' + HttpDecode(param.GetText) + ']');
    res := netPostRequest(getServerUrl() + '/auth', param);
    log4me.log4info('【ServerSession】[Login]:后端返回结果res——[' + res + ']');
end;

请求超时代码打印

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Delphi是一种面向对象的编程语言,它可以用于开发各种类型的应用程序。而Delphi中的HTTP服务是指一种通过HTTP协议提供服务的方式。 Delphi中的HTTP服务可以用于创建一个基于HTTP协议的服务器,接收和处理客户端的请求,并向客户端发送相应的数据。通过这种方式,可以实现Web应用程序、网络通信等功能。 Delphi提供了一些相关的类和组件,用于实现HTTP服务。其中最常用的是TIdHTTPServer组件,它封装了HTTP协议的实现细节,可以轻松地创建和管理HTTP服务器。 使用Delphi的HTTP服务,可以轻松地实现以下功能: 1. 接收和处理HTTP请求:可以监听指定的端口,接收来自客户端的HTTP请求,并根据请求的内容进行相应的处理。 2. 提供静态内容:可以向客户端发送静态的HTML、CSS、JavaScript等文件。 3. 处理动态内容:可以通过编写程序动态生成内容,并将其发送给客户端,实现动态页面的功能。 4. 与数据库交互:可以连接数据库,读取和写入数据,并将查询结果返回给客户端。 5. 处理文件上传和下载:可以接收客户端上传的文件,并保存到指定的位置,也可以向客户端发送文件进行下载。 6. 建立会话和身份验证:可以使用HTTP的Cookie和Session机制,实现用户的身份验证和会话管理。 Delphi中的HTTP服务使用方便,具有很高的灵活性和可扩展性。通过合理地利用HTTP服务,可以快速地开发出各种类型的Web应用程序。同时,Delphi还提供了丰富的开发工具和资源,帮助程序员更好地进行HTTP服务的开发和调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值