🍒 feat(Http): 优化 Http接口与Http日志集成管理

This commit is contained in:
喵你个汪呀 2025-08-21 08:51:42 +08:00
parent 1439739e6c
commit fbd7d59dcb
5 changed files with 90 additions and 11 deletions

View File

@ -9,17 +9,53 @@ namespace Admin.NET.Core;
/// <summary>
/// 远程请求接口特性
/// </summary>
[SuppressSniffer]
[AttributeUsage(AttributeTargets.Class)]
public class HttpRemoteApiAttribute : Attribute
{
/// <summary>
/// 编码
/// 方法名
/// </summary>
[Required]
public string Code { get; set; }
public string Action { get; set; }
/// <summary>
/// 描述
/// </summary>
[Required]
public string Desc { get; set; }
/// <summary>
/// 请求方式
/// </summary>
[Required]
public HttpMethodEnum HttpMethod { get; set; } = HttpMethodEnum.Post;
/// <summary>
/// 参数类型
/// </summary>
public HttpParameterTypeEnum? Type { get; set; }
}
/// <summary>
/// 远程请求接口参数类型枚举
/// </summary>
[SuppressSniffer]
[Description("远程请求接口参数类型枚举")]
public enum HttpParameterTypeEnum
{
[Description("查询")]
Query = 1,
[Description("表单")]
FormData = 2,
[Description("JSON")]
Json = 3,
[Description("XML")]
Xml = 4,
[Description("自定义")]
Custom = 5
}

View File

@ -34,4 +34,14 @@ public static class HttpRemotesExtension {
}
return services;
}
/// <summary>
/// 设置Http远程服务选项
/// </summary>
public static HttpRequestBuilder SetHttpOptions(this HttpRequestBuilder builder, HttpRemoteItem option, string apiDesc = "")
{
builder.SetHttpClientName(option.HttpName);
builder.WithHeader(CommonConst.HttpRemoteApiDescHeaderName, apiDesc, replace:true);
return builder;
}
}

View File

@ -55,7 +55,28 @@ public static partial class ObjectExtension
/// <returns></returns>
public static string ToQueryString(this Dictionary<string, string> dict, bool urlEncode = true)
{
return string.Join("&", dict.Select(p => $"{(urlEncode ? p.Key?.UrlEncode() : "")}={(urlEncode ? p.Value?.UrlEncode() : "")}"));
return string.Join("&", dict.Select(p => $"{(urlEncode ? p.Key?.UrlEncode() : p.Key)}={(urlEncode ? p.Value?.UrlEncode() : p.Value)}"));
}
/// <summary>
/// 根据[CustomJsonProperty]特性转换属性为Query参数
/// </summary>
/// <param name="obj"></param>
/// <param name="urlEncode"></param>
/// <returns></returns>
public static string ToCustomJsonPropertyQueryString(this object obj, bool urlEncode = true)
{
var properties = obj.GetType().GetProperties();
return string.Join("&", properties.Select(p =>
{
var name = p.GetCustomAttribute<CustomJsonPropertyAttribute>()?.Name ?? p.Name.ToFirstLetterLowerCase();
var val = p.GetValue(obj)?.ToString();
if (!urlEncode) return $"{name}={val}";
val = val?.UrlEncode();
name = name?.UrlEncode();
return $"{name}={val}";
}));
}
/// <summary>

View File

@ -16,6 +16,16 @@ public class PageLogHttpOutput
/// </summary>
public long? Id { get; set; }
/// <summary>
/// 客户端名称
/// </summary>
public string HttpClientName { get; set; }
/// <summary>
/// 请求接口描述
/// </summary>
public string HttpApiDesc { get; set; }
/// <summary>
/// 请求方式
/// </summary>

View File

@ -21,13 +21,7 @@
</el-form-item>
<el-form-item label="Query参数" v-if="data.requestUrl?.indexOf('?') != -1">
<el-row v-for="(value, key, index) in queryObject">
<el-col :span="4">
<el-input :value="key" readonly>
</el-input>
</el-col>
<el-col :span="20">
<vue-json-pretty :data="tryJsonParse(value)" showLength showIcon showSelectController />
</el-col>
<span class="query-key">{{ key }}</span> = <span class="query-value">{{ value }}</span>&
</el-row>
</el-form-item>
<el-form-item label="请求头">
@ -89,4 +83,12 @@ const tryJsonParse = (str: string) => {
defineExpose({
openDialog,
});
</script>
</script>
<style lang="less" scoped>
.query-value {
color: #13ce66;
}
.query-key {
color: #d55fde;
}
</style>