代码脚本
FireApi中使用C#语言来编写代码脚本。通过代码脚本可以提升FireApi的灵活性和扩展性。
代码头
用于引入命名空间,定义变量或函数等。
using System.Text;
using System.Collections.Generic;
string _sayMessage = "hello world";
bool _isConfirm;
void SayHello()
{
Hosting.ShowInfo(_sayMessage);
}
内置属性或方法
//当前的环境
EnvironmentVariableSet Environment { get; }
//开发托管服务
IDevHosting Hosting { get; }
//当前目录
string AppPath { get; }
//上下文对象
SendContenxt Context { get; }
//发送指定名称的请求,传递变量
Task<SendResult> SendAsync(string name, object variables = null);
//发送指定名称的请求,传递content文本
Task<SendResult> SendAsync(string name, string content = null);
//发送当前的请求
Task<SendResult> SendAsync();
//获取字节数组
Task<byte[]> GetBytesAsync(string url);
//获取文本内容
Task<string> GetStringAsync(string url);
//读取本地文件所有行
List<string> ReadFileLines(string fileName);
//读取本地文件所有行并json反序列为对象列表
List<T> ReadFileAsObjects<T>(string fileName, T anyObj);
//保存文件
void SaveFile(string fileName, byte[] bytes);
//json序列化对象
string Serialize(object anyObj);
//json反序列化对象
T Deserialize<T>(string content, T anyObj);
发送后可使用的属性
SendResult Result { get; }
Environment 参考
// 发送上下文中的环境
class Environment
{
//设置变量的值
void SetVariable (string name, object value, bool applyConfig = true);
//获取变量的值
object GetVariable (string name);
//移除变量
void RemoveVariable (string name);
//环境的名称
string Name { get; }
}
Hosting 参考
//开发托管服务
interface IDevHosting
{
//弹出错误信息
void ShowInfo (string message);
//弹出警告信息
void ShowWarn (string message);
//弹出错误信息
void ShowError (string message);
//弹出异常信息
void ShowError (Exception exception);
//弹出确认信息,buttons=2 时,显示 Yes 及 No 按钮,buttons=3 时,显示 Yes、No 及 Cancel 按钮
ShowMsgButton ShowConfirm (string message, int buttons = 2);
//在输出窗口显示提示信息
void ConsoleInfo (string message);
//在输出窗口显示错误信息
void ConsoleError (string message);
//服务提供者
IServiceProvider ServiceProvider { get; }
//主窗体
IWin32Window MainWindow { get; }
}
Context 参考
// 发送上下文
class SendContext
{
//开发托管服务
IDevHosting Hosting { get; }
//项目
Project Project { get; }
//请求详情
RequestDetail Request { get; }
//环境
Environment Environment { get; }
//变量集合
List<Variable> Variables { get; }
//发送参数
SendOptions Options { get; }
//取消调用
bool Cancel { get; set; }
//循环请求的数据集合
dynamic LoopData { get; set; }
//SSE内容格式化
Action<SSEContent> SSEFormatter { get; set; }
//取消的令牌
CancellationToken CancellationToken { get; }
}
Options 参考
// 发送参数,部分参数可在“文件”-“选项”-“请求”选项卡设置
class SendOptions
{
//是否使用 CookieContainer,默认值为 true
bool UseCookies { get; set; }
//重定向的最大数目,默认值为 50
int MaxAutomaticRedirections { get; set; }
//是否应跟随重定向响应
bool AllowAutoRedirect { get; set; }
//身份验证信息
ICredentials Credentials { get; set; }
//是否随请求一起发送默认凭据
bool UseDefaultCredentials { get; set; }
//随请求发送授权标头
bool PreAuthenticate { get; set; }
//使用的代理信息
IWebProxy Proxy { get; set; }
//是否对请求使用代理,默认值为 true
bool UseProxy { get; set; }
//用于自动解压缩 HTTP 内容响应的解压缩方法类型
DecompressionMethods AutomaticDecompression { get; set; }
//Cookie 容器。
CookieContainer CookieContainer { get; set; }
//所用的 SSL 协议。
SslProtocols SslProtocols { get; set; }
//响应标头的最大长度,默认值为 64
int MaxResponseHeadersLength { get; set; }
//所允许的最大并发连接数,默认值为 2
int MaxConnectionsPerServer { get; set; }
//提交到代理服务器进行身份验证的凭据
ICredentials DefaultProxyCredentials { get; set; }
//是否根据证书颁发机构吊销列表检查证书
bool CheckCertificateRevocationList { get; set; }
//最大请求内容缓冲区大小,默认值为 2 GB
long MaxRequestContentBufferSize { get; set; }
//最大递归次数,默认值为 3 次
int MaxRecursionTimes { get; set; }
//超时时间,默认值为 100 秒
int Timeout { get; set; }
//文本美化,默认为 true
bool Beautify { get; set; }
//循环任务工作线程数,默认值为 3 个
int LoopWorkers { get; set; }
}
Result 参考
// 发送结果
class SendResult
{
//是否成功
bool IsSuccess { get; set; }
//内容类型
string ContentType { get; set; }
//状态码
int StatusCode { get; set; }
//内容
string Content { get; set; }
//格式 Json、Xml、Html、Plain、Binary
ContentFormat Format { get; set; }
//字节数组
byte[] ByteArray { get; set; }
//根据内容反序列化的动态对象,支持 Json 和 Xml 反序列化
dynamic Data { get; set; }
//信息
string Message { get; set; }
//文件名
string FileName { get; set; }
}
示例1:自动登录
当请求返回状态码401时,表示未进行授权,可以调用一个“登录”请求,登录成功后将AccessToken保存到环境变量中。在“发送后”-“状态(401)”代码区编写:
var result = await SendAsync("登录");
if (result.StatusCode == 200)
{
Environment.SetVariable("token", result.Data.AccessToken, true); //保存到环境变量中
return await SendAsync();
}
示例2:调用生成环境前确认
为了防止误操作,在请求生产环境时,可以弹出一个提示框,作为确认。在“发送前”代码区编写:
if (Environment.Name == "prd")
{
var hasConfirmed = Environment.GetVariable("confirm"); //用于记录是否提示过,避免一次请求多次提示
if (!string.IsNullOrEmpty(hasConfirmed))
{
return;
}
if (Hosting.ShowConfirm("正在调用生产环境,是否进行?") != ShowMsgButton.Yes)
{
Context.Cancel = true; //中止发送
}
else
{
Environment.SetVariable("confirm", true, false); //标记已经提示过,仅当前发送期间内有效,不保存到环境变量
}
}
示例3:读取本地Json文件,批量发送请求
可以批量发送json报文,将 请求体 - raw 的内容设为变量 {{content}},在“发送前”代码区编写:
Context.LoopData = ReadFileLines("C:\\demo.json");
示例4:循环返回的结果,发送其他请求
当一个请求发送成功,返回结果后,可以循环发送另外一个请求。在“发送后”-“状态(200)”代码区编写:
if (Result.Data == null || Result.Data.Count == 0)
{
return;
}
foreach (var item in Result.Data)
{
//删除数据 /api/demo/delete?id={{id}}
await SendAsync("删除数据", new { item.Id });
}
示例5:将返回的结果组装成json,发送其他请求
当一个请求发送成功,返回结果后,可以将它的一些字段再组装成一个json,再发送到另外一个请求。在“发送后”-“状态(200)”代码区编写:
if (Result.Data == null || Result.Data.Count == 0)
{
return;
}
var ids = new List<object>();
foreach (var item in Result.Data)
{
ids.Add(new { Id = item.Id, Reason = "手动删除" });
}
if (Hosting.ShowConfirm("共" + ids.Count + "个数据,确认删除吗") == ShowMsgButton.Yes)
{
//删除数据 /api/demo/delete body-raw : [ { "Id": 1, "Reason": "" } ]
await SendAsync("删除数据", Serialize(ids));
}
示例6:下载并保存文件
发送请求后,将返回文件字节后,直接保存到硬:
//非二进制不处理
if (Result.Format != ContentFormat.Binary)
{
return Result;
}
//var fileName = Context.Request.Uri.Substring(Context.Request.Uri.LastIndexOf("/") + 1);
var fileName = Result.FileName;
//弹出保存文件对话框
var dialog = new SaveFileDialog() { FileName = fileName, Filter = "*.*|*.*" };
if (dialog.ShowDialog(Hosting.MainWindow) == DialogResult.OK)
{
//保存文件
SaveFile(dialog.FileName, Result.ByteArray);
}
示例7:下载并保存文件
发送请求后,将返回文件字节后,直接保存到本地目录:
// /api/download?fileName={{fileName}}
// 发送前代码
Context.LoopData = new List<string>
{
"1.txt",
"2.txt",
"3.txt",
"4.txt",
"5.txt"
};
// 发送后(状态200)代码
//AppPath为当前目录
var directory = AppPath + "\\download";
//变量fileName是请求url中的变量{{fileName}},由于循环数据是一个字符串列表,故元素就作为它的唯一变量
var fileName = directory + "\\" + Environment.GetVariable("fileName");
//保存文件
SaveFile(fileName, Result.ByteArray);