代码脚本


  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);