Skip to main content

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"
}

注意事项​

  1. 参数类型:所有URL参数都是字符串类型,需要根据业务需求进行类型转换
  2. 空值处理:PageUrl 可能为空,建议在使用前进行空值检查
  3. 编码问题:SDK 会自动处理URL编码,无需手动解码
  4. 参数验证:建议对必需参数进行验证,避免空引用异常
  5. 安全性:不要直接将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
}

相关文档​