我是矩阵参数的新手,我知道 CF10 可以通过他们新的 RESTful API 支持访问它们。
但是,有没有办法在不使用 RESTful API 支持的情况下访问这些参数?
例如http://moremaps.com/map/color.cfm;lat=50;long=20;scale=32000
我是矩阵参数的新手,我知道 CF10 可以通过他们新的 RESTful API 支持访问它们。
但是,有没有办法在不使用 RESTful API 支持的情况下访问这些参数?
例如http://moremaps.com/map/color.cfm;lat=50;long=20;scale=32000
您可以通过 访问它cgi.path_info
。例如:
http://localhost/myApp/index.cfm;this=that;pet=cat
变成
cgi.PATH_INFO=/MyApp/index.cfm;this=that;pet=cat
那么你就可以
struct function getMatrix() output="false" {
var arURLData = ListToArray(cgi.path_Info, ";");
var stData = {};
if (arrayLen(arData) <= 1) {
return stData;
}
for(var i = 2; i <= ArrayLen(arData); i++) {
// setVariable("stData.#listfirst(arURLData[i], "=")#", listlast(arURLData[i]);
stData[listfirst(arURLData[i], "=")] = getToken(arURLData[i], 2, "=");
}
return stData;
}
您可能需要添加一些代码来防止 URL 注入攻击。
您可以使用:
color.cfm;lat=50;long=20;scale=32000
然后获取参数字符串:
ListRest(getPageContext().getRequest().getRequestUri(),';')
这在 CFMX 中有效——它不是特定于 CF10 或 RESTful API 的一部分,并且由于遵循 servlet 规范的 servlet 容器(Tomcat/Jrun/etc)具有获取原始 URL 的能力而可用。
(您当然可以使用 URL 重写来向用户隐藏 .cfm。)
没有矩阵范围,因为 CF 尚未完全实现它 - 它是作为 REST Web 服务的一部分完成的(它作为具有适当RestArgSource
属性的参数)。只有 CF 团队才能说出他们为什么要这样设计。
但是,您可以像这样轻松创建自己的范围/结构:
var MatrixString = ListRest(getPageContext().getRequest().getRequestUri(),';');
var Matrix = {};
for ( var CurParam in ListToArray(MatrixString,';') )
Matrix[ UrlDecode( ListFirst(CurParam,'=') ) ] = UrlDecode( ListRest(CurParam,'=') );
(显然,如果不在函数内部使用,请删除 var 范围。)
这既可以直接工作,也可以通过 IIS 工作,并且在其他服务器上也应该可以正常工作,即使 path_info 可能已被修改。
更新:这个答案不完整/不准确。
进一步阅读矩阵参数,它们实际上可以出现在 request_uri 中的任何点(host_name 之后,query_string 之前的整个部分)——也就是说,script_name 和 path_info 都可以包含参数,而不会影响它们的最终值。
为了澄清这一点,这两个 URL:
http://domain.com/a/b.cfm/c/d http://domain.com/a;alpha=1/b.cfm;beta=2/c;gamma=3/d;delta=4
导致这些 CGI 变量:
脚本名称 = /a/b.cfm 路径信息 = /c/d
(IIS 中的 path_info 实现不正确除外。)
显然,提取和处理这些属性比上面的代码更复杂 - 一旦我确定我更充分地理解它们,我将再次更新这个答案。
同时,这里有几个潜在的选项——如果路径元素有一个,第一个返回一个参数结构,第二个返回一个包含每个路径元素的数组——这些中的任何一个是否合适将取决于矩阵参数如何使用:
<cffunction name="getMatrixStruct" returntype="Struct" output=false
hint="Returns struct with item for each path element with params"
>
<cfargument name="RequestUri" type="String" required hint="The non-host and non-querystring part of a URL." />
<cfscript>
var Result = {};
for ( var CurSegment in ListToArray(RequestUri,'/') )
{
var SegName = UrlDecode( ListFirst(CurSegment,';') );
for ( var CurParam in ListToArray(ListRest(CurSegment,';')) )
Result[SegName][UrlDecode( ListFirst(CurParam,'=') ) ] = UrlDecode( ListRest(CurParam,'=') );
}
return Result;
</cfscript>
</cffunction>
<cffunction name="getMatrixArray" returntype="Array" output=false
hint="Returns array of structs for all path element, with any parameters included."
>
<cfargument name="RequestUri" type="String" required hint="The non-host and non-querystring part of a URL." />
<cfscript>
var Result = [];
var Pos = 0;
for ( var CurSegment in ListToArray(RequestUri,'/') )
{
Result[++Pos] = { 'Name' = UrlDecode( ListFirst(CurSegment,';') ) };
for ( var CurParam in ListToArray(ListRest(CurSegment,';')) )
Result[Pos][UrlDecode( ListFirst(CurParam,'=') ) ] = UrlDecode( ListRest(CurParam,'=') );
}
return Result;
</cfscript>
</cffunction>