HTTP 传输 - Snet Docs

🔌 HTTP 传输

命名空间: Snet.Core.communication.net.http.client / Snet.Core.communication.net.http.service | 类: HttpClientOperate, HttpServiceOperate

注意: HTTP 传输类直接继承 CoreUnify 而非 CommunicationAbstract。这是因为它遵循请求-响应模式而非流式连接。

HttpClientOperate — HTTP 客户端

继承: CoreUnify<HttpClientOperate, HttpClientData.Basics>

配置 (HttpClientData.Basics)

属性 类型 默认值 说明
MaxConnectCount int 255 每服务器最大连接数

请求模型 (RequestData)

属性 类型 默认值 说明
Url string "http://127.0.0.1:6688/api/snet" 请求 URL(必须是绝对 HTTP/HTTPS URI)
Headers ConcurrentDictionary<string,string> {} 自定义请求头(不区分大小写)
Method HttpMethod GET HTTP 方法
BodyType BType 枚举 Raw FormData / Raw / None
BodyContent object? null Raw: string,FormData: IReadOnlyDictionary<string,string>(Dictionary/ConcurrentDictionary)
Encoding Encoding UTF8 内容编码
ContentType string "application/json" Content-Type
TimeOut TimeSpan 60s 请求超时
Proxy IWebProxy? null 代理
CookieContainer CookieContainer new() Cookie 存储

响应数据 (ResponseData):StatusCode (int)、ResHeadersDatas (ConcurrentDictionary<string,string>?)、ResCookieData (CookieCollection)、ResData (string?)、ReqData (RequestData)。

API

// 发送请求 — 核心方法(非绝对 HTTP/HTTPS URL 会抛出 ArgumentException)
public async Task<OperateResult> RequestAsync(RequestData requestData, CancellationToken token = default);

// 同步版本
public OperateResult Request(RequestData requestData);

使用示例

using Snet.Core.communication.net.http.client;
using static Snet.Core.communication.net.http.client.HttpClientData;

var http = await HttpClientOperate.InstanceAsync(new Basics());

// GET
var getResp = await http.RequestAsync(new RequestData {
    Url = "https://api.example.com/data", Method = HttpMethod.Get
});

// POST JSON
var postResp = await http.RequestAsync(new RequestData {
    Url = "https://api.example.com/data", Method = HttpMethod.Post,
    BodyType = BType.Raw, BodyContent = "{\"name\":\"value\"}"
});

// POST Form
var formResp = await http.RequestAsync(new RequestData {
    Url = "https://api.example.com/upload", Method = HttpMethod.Post,
    BodyType = BType.FormData,
    BodyContent = new Dictionary<string, string> { ["field1"] = "value1" }
});

HttpServiceOperate — HTTP 服务端

继承: CoreUnify<HttpServiceOperate, HttpServiceData.Basics> | 接口: IOn, IOff, IStatus

配置 (HttpServiceData.Basics,继承 WAModel)

属性 类型 默认值 说明
ContentType string "application/json" 请求与响应内容类型
AbsolutePaths List<AbsolutePathsModel> [new("/api/snet", HttpMethod.Get)] 有效 API 路由;每个路由(Path + Method)配置各自的请求方式
AllowedOrigins List<string> [] 允许携带凭据跨域访问的精确来源列表(空 = 不信任任何来源)
MaxRequestBodyBytes int 1048576 单个请求体最大字节数(1 MiB);超限返回 413
CrossDomain bool false CORS 支持(来自 WAModel
IpAddress string "127.0.0.1" 监听地址(来自 WAModel
Port int 6688 监听端口(来自 WAModel

CORS 行为:启用 CrossDomain 时,仅当来源命中 AllowedOrigins 才回显 Access-Control-Allow-Origin(并附带 Access-Control-Allow-Credentials: true);预检 OPTIONS 在来源允许时返回 204,否则返回 403

API

await server.OnAsync(CancellationToken token = default);        // 启动 HttpListener(端口被占用时返回"端口被占用")
await server.OffAsync(bool hardClose = false, CancellationToken token = default);        // 停止
await server.GetStatusAsync(CancellationToken token = default);
// 同步包装: On(), Off(), GetStatus()

// 写入 JSON 响应 — 实例方法 + 静态泛型版本
await server.WriteAsync(HttpListenerResponse response, object obj, CancellationToken token = default);
await server.WriteAsync<T>(HttpListenerResponse response, T obj, CancellationToken token = default);

WaitHandler 事件数据

字段 类型 说明
Request HttpListenerRequest 请求数据
Response HttpListenerResponse 响应对象
BodyData string? 请求体内容

使用示例

using System.Net;
using Snet.Core.communication.net.http.service;
using static Snet.Core.communication.net.http.service.HttpServiceData;  // Basics, WaitHandler, AbsolutePathsModel

var config = new Basics {
    IpAddress = "0.0.0.0", Port = 8080,
    CrossDomain = true,
    AbsolutePaths = new List<AbsolutePathsModel> {
        new("/api/snet", HttpMethod.Post),
        new("/api/health", HttpMethod.Get)
    }
};
var server = await HttpServiceOperate.InstanceAsync(config);

server.OnDataEvent += async (s, e) => {
    if (e.ResultData is WaitHandler wh) {
        Console.WriteLine($"路径: {wh.Request.Url!.AbsolutePath}");
        await HttpServiceOperate.WriteAsync(wh.Response, new { status = "ok" });
    }
};

await server.OnAsync();

参见