C# 获取请求时页面的URL
本文档介绍如何使用 C# 脚本获取请求接口时的页面URL, 并解析URL参数。
使用场景
当需要根据请求来源页面进行业务处理时,例如:
- 获取URL参数进行条件判断
- 根据来源页面执行不同逻辑
- 记录请求来源信息
- 动态调整返回数据
- 实现页面间的数据传递
示例代码
以下示例演示如何获取页面URL并解析URL参数:
using System;
using System.Linq;
using System.Collections.Generic;
using Chameleon.Common.Models; // 引入 LabelValue
using Chameleon.Common.Context;
using Chameleon.SDK;
using Chameleon.Database;
public class ChameleonCSharpScript
{
public object Execute(ComponentContext context, ChameleonSDK sdk)
{
// 从请求上下文中获取页面URL
var url = context.Request.PageUrl;
var urlParams = sdk.Helper.ParseUrlQuery(url);
// 这里 urlParams 是个 Dictionary<string,string> 类型
// 返回只是为了测试,URL参数是拿到了的
return urlParams.Select(t => new LabelValue {
Label = t.Key,
Value = t.Value,
}).ToList();
}
}
关键点说明
1. 获取页面URL
通过 context.Request.PageUrl 属性直接获取请求时所在页面的URL:
var url = context.Request.PageUrl;
说明:
PageUrl是请求上下文中的属性,包含完整的页面URL- 包含协议、域名、路径和查询参数
- 如果没有页面URL,该属性为
null
2. 解析URL参数
使用 SDK 提供的 sdk.Helper.ParseUrlQuery(url) 方法解析URL参数:
var urlParams = sdk.Helper.ParseUrlQuery(url);
说明:
- 返回类型为
Dictionary<string, string> - Key 为参数名,Value 为参数值
- 自动处理URL编码
3. 使用参数
解析后的参数可以直接通过字典方式访问:
// 获取特定参数
if (urlParams.TryGetValue("id", out var id))
{
// 使用 id 参数
}
// 遍历所有参数
foreach (var param in urlParams)
{
var key = param.Key;
var value = param.Value;
}
扩展示例
示例1:根据URL参数执行不同逻辑
public object Execute(ComponentContext context, ChameleonSDK sdk)
{
var url = context.Request.PageUrl;
var urlParams = sdk.Helper.ParseUrlQuery(url);
// 根据来源页面类型执行不同逻辑
if (urlParams.TryGetValue("type", out var type))
{
if (type == "detail")
{
// 详情页面逻辑
return ProcessDetail(urlParams);
}
else if (type == "edit")
{
// 编辑页面逻辑
return ProcessEdit(urlParams);
}
}
return null;
}
示例2:获取并验证必需参数
public object Execute(ComponentContext context, ChameleonSDK sdk)
{
var url = context.Request.PageUrl;
var urlParams = sdk.Helper.ParseUrlQuery(url);
// 验证必需参数
if (!urlParams.TryGetValue("id", out var id))
{
return "缺少必需参数:id";
}
if (!urlParams.TryGetValue("type", out var type))
{
return "缺少必需参数:type";
}
// 使用参数进行业务处理
// ...
return null;
}
示例3:记录请求来源
public object Execute(ComponentContext context, ChameleonSDK sdk)
{
var url = context.Request.PageUrl;
var urlParams = sdk.Helper.ParseUrlQuery(url);
// 获取来源信息
var source = urlParams.TryGetValue("source", out var s) ? s : "unknown";
var referrer = urlParams.TryGetValue("referrer", out var r) ? r : "direct";
// 记录到业务数据中
var list = context.Request.List;
foreach (var item in list)
{
item["Source"] = source;
item["Referrer"] = referrer;
item["PageUrl"] = url;
}
return null;
}
示例4:动态过滤数据
public object Execute(ComponentContext context, ChameleonSDK sdk)
{
var url = context.Request.PageUrl;
var urlParams = sdk.Helper.ParseUrlQuery(url);
var list = context.Request.List;
// 根据URL参数过滤数据
if (urlParams.TryGetValue("status", out var status))
{
list = list.Where(item =>
{
var itemStatus = Convert.ToString(item["Status"]);
return itemStatus == status;
}).ToList();
}
// 根据URL参数排序
if (urlParams.TryGetValue("sort", out var sortField))
{
list = sortField switch
{
"date" => list.OrderByDescending(item => item["CreateDate"]).ToList(),
"name" => list.OrderBy(item => item["Name"]).ToList(),
_ => list
};
}
context.Request.List = list;
return null;
}
示例5:页面间数据传递
public object Execute(ComponentContext context, ChameleonSDK sdk)
{
var url = context.Request.PageUrl;
var urlParams = sdk.Helper.ParseUrlQuery(url);
// 从URL参数获取传递的数据
var parentId = urlParams.TryGetValue("parentId", out var pid) ? pid : null;
var category = urlParams.TryGetValue("category", out var cat) ? cat : null;
if (string.IsNullOrEmpty(parentId))
return null;
// 根据传递的数据查询相关信息
var list = context.Request.List;
foreach (var item in list)
{
item["ParentId"] = parentId;
item["Category"] = category;
}
return null;
}
URL参数格式
常见的URL格式
https://example.com/page?id=123&type=detail
https://example.com/page?name=张三&age=25&city=北京
https://example.com/page?filter=status:active,category:A
解析结果
对于URL https://example.com/page?id=123&type=detail,解析结果为:
{
"id": "123",
"type": "detail"
}
注意事项
- 参数类型:所有URL参数都是字符串类型,需要根据业务需求进行类型转换
- 空值处理:PageUrl 可能为空,建议在使用前进行空值检查
- 编码问题:SDK 会自动处理URL编码,无需手动解码
- 参数验证:建议对必需参数进行验证,避免空引用异常
- 安全性:不要直接将URL参数用于数据库查询,需要进行参数化处理
常见问题
Q: PageUrl 是什么时候设置的?
A: PageUrl 是请求上下文中的属性,在请求时自动设置,包含当前请求来源页面的完整URL。
Q: 如果URL中没有参数会怎样?
A: ParseUrlQuery 方法会返回一个空的 Dictionary<string, string>,不会返回 null。
Q: 如何处理特殊字符?
A: SDK 会自动处理URL 编码,特殊字符会被正确解码。
Q: 可以获取完整的URL吗?
A: 可以,context.Request.PageUrl 包含完整的页面URL,包括协议、域名、路径和查询参数。
Q: 如何判断参数是否存在?
A: 使用 ContainsKey 方法或 TryGetValue 方法判断参数是否存在:
// 方法1:ContainsKey
if (urlParams.ContainsKey("id"))
{
var id = urlParams["id"];
}
// 方法2:TryGetValue(推荐)
if (urlParams.TryGetValue("id", out var id))
{
// 使用 id
}