1、通用Web服务控件简介
Web服务已经非常普及,无论是各大平台的API回调,还是提供Restful API服务,都在使用Web服务,为此专门开发了一款通用的Web服务控件。通过该控件可以立即实现Web服务器功能,前端的任何请求,都转换成对应的事件响应,非常方便。
通用Web服务控件图标:
通用Web服务控件开发语言:delphi
通用Web服务控件名称:TWWW_Component
1.1 控件支持的功能
- 根据端口自动支持 HTTP 或者 HTTPs 服务(80-HTTP,443-HTTPs,其它端口值一律默认HTTP)
- 支持静态文件自动下载,无需写任何代码
- 支持JWT Token 标准认证,无需书写 JWT 任何代码
- 支持通用 Web 请求,可以携带JWT也可以不携带,请求地址不同
- 支持 JSON 和 XML 请求
- 支持流文件请求
- 支持 form-data 参数、文件请求(单一文件)
- 支持POST、GET等方法
- 支持任意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 Token | form-data提交 | 字符串请求 | 流请求 |
---|---|---|---|---|---|
OnRequestJWT | Generic_BaseURL | 请求JWT | |||
OnRequestFormData | Generic_BaseURL | √ | |||
OnRequestFormData_JWT | JWT_BaseURL | √ | √ | ||
OnRequestGeneric | Generic_BaseURL | √ | |||
OnRequestGeneric_Stream | Generic_BaseURL | √ | |||
OnRequestGenericJWT | JWT_BaseURL | √ | |||
OnRequestGenericJWT_Stream | JWT_BaseURL | √ |
2、控件属性、方法、事件
2.1 控件属性
序号 | 名称 | 类型 | 说明 |
---|---|---|---|
1 | Web_Address | 字符串 | 设置当前控件的Web地址。可以是域名地址或者是IP |
2 | Web_Port | 数字型 | Web 服务的端口,默认:80,如果使用 HTTPS 则应该设置为443 |
3 | Static_BaseURL | 字符串 | 静态文件下载的基地址 |
4 | Static_RootDir | 字符串 | 静态文件下载对应的本地文件基本路径 |
5 | Generic_BaseURL | 字符串 | 通用Web 请求 基地址 |
6 | JWT_BaseURL | 字符串 | 使用 JWT 的通用Web请求基地址 |
7 | JWT_Secret | 字符串 | 生成 JWT Token 的密钥 |
8 | JWT_Timeout | 数字型 | JWT Token 的有效期长度,单位:秒 |
9 | log | 逻辑性 | 是否记录系统日志, 默认: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;
参数说明:
- errcode:错误代码,一般会标明出现错误的函数名称等
- 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;
参数说明:
- 前端请求 JWT 的时候会上送 usercode,userpassword,useragent 这三个参数,事实上,前端请求真正上送的参数是 usercode,userpassword,并不包含 useragent 参,是系统自动获取的。
- 在该事件处理函数中,应该根据这三个参数确定返回给前端的 JWT 的参数,包括:JWTSecret,extraInof,JWTTimeout 这三个参数。如果经过确认不希望给前端返回 JWT,那么直接设置 allow 为False 即可。否则可以设置这三个参数JWTSecret,extraInof,JWTTimeout,也可以不设置,如果不设置这三个参数,那么系统将会使用控件自身的 JWT_Secret 和 JWT_Timeout 属性代替 JWTSecret和JWTTimeout。
- 如果 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;
序号 | 参数 | 属性 | 说明 |
---|---|---|---|
1 | RequestURI | 入口参数,必有 | 前端请求的完整URI。例如:http://localhost/JWT/SZHN?A=中国&B=12&C=ABC123 |
2 | RequestIP | 入口参数,必有 | 前端请求的IP |
3 | RequestMethod | 入口参数,必有 | 前端请求的方法:POST、GET等 |
4 | RequestHead | 入口参数,必有 | 前端请求的头信息:已经转换成JSON 格式 |
5 | RequestQuery | 入口参数,可选 | 前端请求地址中携带的参数。已经转换成JSON格式 |
6 | form_data_params | 入口参数,必有 | 前端 from-data 中包含的参数,不包括文件参数 |
7 | form_data_Filename | 入口参数,可选 | 前端 from-data 中包含的文件按名称 |
8 | form_data_Stream | 入口参数,可选 | 前端 form-data 中包含的文件内容流,文件名称为:form_data_Filename |
9 | ResponseDataStream | 出口参数,可选 | 后端返回给前端的数据流,这个与 ResponseData 二选一,如果都存在,在只发送 ResponseData |
10 | ResponseData | 出口参数,可选 | 后端返回给前端的字符串(UTF-8),这个与 ResponseDataStream 二选一,如果都存在,只发送 ResponseData |
11 | content_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、演示、下载
- 所有请求都可以通过浏览器或者postman 实现
- 为了大家使用控件方便,专门做了一个演示程序,简单示范了控件的具体使用。
- 下载的文件中包含:
A. 控件可安装源代码
B. 控件使用的帮助文件
C. 控件使用演示程序源代码及执行文件 - 下载地址:WWW_Component
使用过程中,如果有任何问题,可以联系:QQ 910731685