【delphi】通用 Web 服务器控件(含源码及演示程序)

1、通用Web服务控件简介

Web服务已经非常普及,无论是各大平台的API回调,还是提供Restful API服务,都在使用Web服务,为此专门开发了一款通用的Web服务控件。通过该控件可以立即实现Web服务器功能,前端的任何请求,都转换成对应的事件响应,非常方便。

通用Web服务控件图标:在这里插入图片描述
在这里插入图片描述

通用Web服务控件开发语言:delphi

通用Web服务控件名称:TWWW_Component

1.1 控件支持的功能

  1. 根据端口自动支持 HTTP 或者 HTTPs 服务(80-HTTP,443-HTTPs,其它端口值一律默认HTTP)
  2. 支持静态文件自动下载,无需写任何代码
  3. 支持JWT Token 标准认证,无需书写 JWT 任何代码
  4. 支持通用 Web 请求,可以携带JWT也可以不携带,请求地址不同
  5. 支持 JSON 和 XML 请求
  6. 支持流文件请求
  7. 支持 form-data 参数、文件请求(单一文件)
  8. 支持POST、GET等方法
  9. 支持任意API名称请求

1.2 关于 JWT 知识

请参见知乎:https://zhuanlan.zhihu.com/p/86937325

1.3 控件使用说明

通用 Web 服务控件,设置简单的参数,可以实现所有Web请求的响应。不同的请求,请求地址不同,响应事件也不一样!控件提供3个不同的 Web 服务基本地址参数,不同的 Web 服务使用不同的基地址。分别是:Static_Base_URL、Generic_BaseURL、JWT_BaseURL 这三个基地址表示不同的3个 Web 服务请求地址。其中 Static_BaseURL 表示下载静态文件的地址,Generic_BaseURL 表示的是通用 Web 请求的地址,JWT_BaseURL 表示的是需要使用 JWT Token 的Web 通用请求地址。

默认 Web_port 是 80 端口,如果不是 80或者443 端口,请在 localhost 后加上端口号,如果是 443 端口,请使用 https 请求!

静态下载文件举例:
下载文件举例
参数设置如下:
Static_BaseURL :Static //可以多级,注意前后都不需要 /,例如:Static/ShenZhen
Static_RootDir :F:\SZHN //可以多级目录,,例如:D:\Document\Download

在 F盘的 SZHN 目录下包含如下文件:
	F:\SZHN\A.txt
	F:\SZHN\20201204\ABC.pdf

下载文件的地址组合: http://localhost/   +  Static_BaseURL  +  /  +  文件目录(相对Static_RootDir的目录)  +  /   +  文件名   其中 localhost 可以是服务器的域名或者IP地址。在浏览器地址输入如下地址即可实现文件下载。

例如    下载 A.txt 文件: http://localhost/Static/A.txt
	下载 ABC.pdf :    http://localhost/Static/20201204/ABC.pdf

下载文件不涉及响应事件,设置好参数即可自动实现。

1.4 不同请求响应事件对照表

事件请求地址需要JWT Tokenform-data提交字符串请求流请求
OnRequestJWTGeneric_BaseURL请求JWT
OnRequestFormDataGeneric_BaseURL
OnRequestFormData_JWTJWT_BaseURL
OnRequestGenericGeneric_BaseURL
OnRequestGeneric_StreamGeneric_BaseURL
OnRequestGenericJWTJWT_BaseURL
OnRequestGenericJWT_StreamJWT_BaseURL

2、控件属性、方法、事件

控件基本属性
在这里插入图片描述

2.1 控件属性

序号名称类型说明
1Web_Address字符串设置当前控件的Web地址。可以是域名地址或者是IP
2Web_Port数字型Web 服务的端口,默认:80,如果使用 HTTPS 则应该设置为443
3Static_BaseURL字符串静态文件下载的基地址
4Static_RootDir字符串静态文件下载对应的本地文件基本路径
5Generic_BaseURL字符串通用Web 请求 基地址
6JWT_BaseURL字符串使用 JWT 的通用Web请求基地址
7JWT_Secret字符串生成 JWT Token 的密钥
8JWT_Timeout数字型JWT Token 的有效期长度,单位:秒
9log逻辑性是否记录系统日志, 默认:True 表示需要记录

2.2 控件方法

2.2.1 StartServer(打开Web服务器)

打开WWW_Component服务,保证API请求功能正常。如果打开成功,函数返回True,表示可以使用API功能,否则返回False,错误信息在ErrorMsg中查看,此时不能使用Web服务。

function  StartServer(var ErrorMsg : string) : Boolean;

2.2.2 StopServer(关闭Web服务)

关闭Web服务功能。关闭后将不能在响应Web请求功能!

 procedure StopServer;

2.2.3 WriteLog (书写日志功能)

书写日志函数。
参数说明:Msg :需要写入记录的内容
日志文件名称: 主程序名称 + ( + 支付控件名称 + )+ _Customer.TXT

 procedure writelog(msg : string);   //书写日志

2.2.4 Format_JSON (格式化JSON字符串)

格式化JSON字符串,便于阅读。
参数说明:
JSONStr :表示需要格式化的JSON字符串,如果不是合法的JSON字符串,则不进行任何处理
Indented : 表示前面是否证件 Tab 缩进,这样在日志中更美观
结果为已经格式化的JSON字符串。

function Format_JSON(JSONStr : string; Indented : Boolean = True) : string;

2.2.5 Format_XML(格式化XML)

格式化XML,以便容易查看。
参数说明:
XML:表示需要进行格式化的XML字符串
indent:表示格式化后每行前面是否增加一个Tab,以便XML不会太靠近编辑器的左边,主要为了记录日志更美观!

function Format_XML(XML : string; indent : Boolean = True) : string;

格式化前:
<return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[appid参数长度有误]]></return_msg>

格式化后:
在这里插入图片描述

2.3 控件事件

特别说明:在事情响应函数中,字符串都是使用的 PChar 类型,不是 String 类型,在使用的过程中需要注意,尤其是在字符串的合并计算过程中需要注意!

2.3.1 OnError(错误事件)

控件运行出现错误时会触发这个事件。

//0. 错误事件
 TOnError      = procedure(Sender : TObject; errcode,errmsg : PChar) of object;

参数说明:

  1. errcode:错误代码,一般会标明出现错误的函数名称等
  2. errmsg:错误信息详细描述

2.3.2 OnRequestJWT(请求JWT Token事件)

对于 JWT 服务,首先必须获取到 JWT Token,通过这个 Token 才可以继续访问相关的API。

 //1. 获取 JWT token的登录事件                                                            //额外信息
 TOnRequestJWT = procedure(Sender : TObject; usercode,userpassword, useragent : PChar; var JWTSecret, extraInfo : PChar; var JWTTimeout : integer; var allow : Boolean) of object;

参数说明:

  1. 前端请求 JWT 的时候会上送 usercode,userpassword,useragent 这三个参数,事实上,前端请求真正上送的参数是 usercode,userpassword,并不包含 useragent 参,是系统自动获取的。
  2. 在该事件处理函数中,应该根据这三个参数确定返回给前端的 JWT 的参数,包括:JWTSecret,extraInof,JWTTimeout 这三个参数。如果经过确认不希望给前端返回 JWT,那么直接设置 allow 为False 即可。否则可以设置这三个参数JWTSecret,extraInof,JWTTimeout,也可以不设置,如果不设置这三个参数,那么系统将会使用控件自身的 JWT_Secret 和 JWT_Timeout 属性代替 JWTSecret和JWTTimeout。
  3. 如果 allow 为 True,系统会自动给前端返回 JWT Token 的JSON字符串。

特别说明:该事件处理函数是在线程中执行的,所以要确保线程安全!

2.3.3 OnRequestFormData(通过 form-data 方式提交请求)

如果客户选通过 form-data 方式提交的请求,会触发这个事件,后台可以在这个事件中进行回应。如果后台没有响应这个事件,控件将自动回复200状态码,数据信息回复空。

TOnRequestFormData  = procedure(Sender : TObject; RequestURI, RequestIP, RequestMethod, RequestHead, RequestQuery, form_data_params, form_data_Filename : PChar; form_data_Stream : TStream; var ResponseDataStream : TStream; var ResponseData, content_type : PChar) of object;
序号参数属性说明
1RequestURI入口参数,必有前端请求的完整URI。例如:http://localhost/JWT/SZHN?A=中国&B=12&C=ABC123
2RequestIP入口参数,必有前端请求的IP
3RequestMethod入口参数,必有前端请求的方法:POST、GET等
4RequestHead入口参数,必有前端请求的头信息:已经转换成JSON 格式
5RequestQuery入口参数,可选前端请求地址中携带的参数。已经转换成JSON格式
6form_data_params入口参数,必有前端 from-data 中包含的参数,不包括文件参数
7form_data_Filename入口参数,可选前端 from-data 中包含的文件按名称
8form_data_Stream入口参数,可选前端 form-data 中包含的文件内容流,文件名称为:form_data_Filename
9ResponseDataStream出口参数,可选后端返回给前端的数据流,这个与 ResponseData 二选一,如果都存在,在只发送 ResponseData
10ResponseData出口参数,可选后端返回给前端的字符串(UTF-8),这个与 ResponseDataStream 二选一,如果都存在,只发送 ResponseData
11content_type出口参数,可选后端发送给前端的内容类型,请在遵照HTTP content-type 便准书写

2.3.4 OnRequestFormData_JWT(通过 form-data 方式提交请求 必须JWT)

具体使用说明请参见源代码文档!

2.3.5 OnRequestGeneric(通过Web请求,字符串参数请求)

具体使用说明请参见源代码文档!

2.3.6 OnRequestGeneric_Stream(通过Web请求,流方式参数请求)

具体使用说明请参见源代码文档!

2.3.7 OnRequestGenericJWT(通过Web请求,字符串方式参数请求,提供JWT Token验证)

具体使用说明请参见源代码文档!

2.3.8 OnRequestGenericJWT_Stream(通过Web请求,流方式参数请求,提供JWT Token验证)

具体使用说明请参见源代码文档!

3、无法打开服务问题解决

如果打开服务时出现类似如下提示:
Could not add the following Url to the server.
Be sure that you have reserved the Url in Http.Sys with proper permissions.
Url: http://+:80/GenericAAA

说明 GenericAAA 这个路径没有在微软的 Http.Sys中配置,此时需要使用 HttpConfig 这个工具来设置就可以解决,无论是路径不存在还是端口未配置,都使用这个工具。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
至此,配置已经完成,打开Web服务就不会出现问题了。

4、演示、下载

  1. 所有请求都可以通过浏览器或者postman 实现
  2. 为了大家使用控件方便,专门做了一个演示程序,简单示范了控件的具体使用。
  3. 下载的文件中包含:
    A. 控件可安装源代码
    B. 控件使用的帮助文件
    C. 控件使用演示程序源代码及执行文件
  4. 下载地址:WWW_Component

使用过程中,如果有任何问题,可以联系:QQ 910731685

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海纳老吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值