Url 是否可以在ColdFusion中访问矩阵参数(名称-值对以分号分隔)?
我是新手,我知道CF10可以通过他们新的RESTful API支持来访问它们 但是,有没有一种方法可以在不使用RESTful API支持的情况下访问这些参数Url 是否可以在ColdFusion中访问矩阵参数(名称-值对以分号分隔)?,url,coldfusion,uri,cfml,Url,Coldfusion,Uri,Cfml,我是新手,我知道CF10可以通过他们新的RESTful API支持来访问它们 但是,有没有一种方法可以在不使用RESTful API支持的情况下访问这些参数 例如,http://moremaps.com/map/color.cfm;lat=50;长=20;scale=32000您可以通过cgi.path\u info访问它。例如: http://localhost/myApp/index.cfm;this=that;pet=cat 变成 cgi.PATH_INFO=/MyApp/index.
例如,
http://moremaps.com/map/color.cfm;lat=50;长=20;scale=32000
您可以通过cgi.path\u 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;
}
结构函数getMatrix()输出=“false”{
var arURLData=ListToArray(cgi.path_Info,“;”);
var stData={};
如果(arrayLen(arData)您可以使用:
color.cfm;lat=50;long=20;scale=32000
然后使用以下命令获取参数字符串:
ListRest(getPageContext().getRequest().getRequestUri(),';')
这在CFMX中得到了应用——它不是CF10或RESTful API的一部分所特有的,并且由于servlet容器(Tomcat/Jrun/etc)遵循servlet规范,能够获取原始URL,所以它是可用的
(当然,您可以使用URL重写对用户隐藏.cfm。)
没有矩阵作用域,因为CF没有完全实现它-它是作为REST webservices的一部分完成的(在REST webservices中,它作为一个参数,具有适当的
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工作,在其他服务器上也可以正常工作,即使路径信息可能已被修改
更新:此答案不完整/不准确 进一步阅读矩阵参数,它们实际上可以出现在请求\u uri中的任何点上(主机\u名称之后的整个部分,查询\u字符串之前)——也就是说,脚本\u名称和路径\u信息都可以包含参数,而不影响其最终值 为了澄清这一点,这两个URL: htp://domain.com/a/b.cfm/c/d http://domain.com/a;alpha=1/b.cfm;beta=2/c;gamma=3/d;delta=4 htp://domain.com/a/b.cfm/c/d http://domain.com/a;α=1/b.cfm;β=2/c;γ=3/d;δ=4 导致这些CGI变量: script_name = /a/b.cfm path_info = /c/d 脚本名称=/a/b.cfm 路径信息=/c/d (除了在IIS中,路径信息的实现不正确。) 显然,提取和处理这些属性要比上面的代码复杂得多——一旦我确保更全面地理解它们,我将再次更新这个答案 同时,这里有两个可能的选项-第一个选项返回参数结构(如果路径元素有),第二个选项返回包含每个路径元素的数组-这两个选项中的任何一个是否合适取决于矩阵参数的使用方式:
<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>
var Result={};
for(ListToArray中的var CurSegment(RequestUri,“/”))
{
var SegName=UrlDecode(ListFirst(CurSegment,;);
for(ListToArray中的var CurParam(ListRest(CurSegment,;)))
结果[SegName][UrlDecode(ListFirst(CurParam,'='))]=UrlDecode(ListRest(CurParam,'='));
}
返回结果;
var结果=[];
var-Pos=0;
for(ListToArray中的var CurSegment(RequestUri,“/”))
{
结果[++Pos]={'Name'=UrlDecode(ListFirst(CurSegment,;'))};
for(ListToArray中的var CurParam(ListRest(CurSegment,;)))
结果[Pos][UrlDecode(ListFirst(CurParam,'='))]=UrlDecode(ListRest(CurParam,'='));
}
返回结果;
您可以执行color.cfm;lat=50;long=20;scale=32000
然后使用ListRest获取参数字符串(getPageContext().getRequest().getRequestUri(),';')
@PeterBoughton谢谢你,你能把它作为一个答案吗?谢谢你知道为什么我们没有这个矩阵作用域吗?谢谢你,不幸的是CGI.PATH\u INFO
在CF10中被破坏了有任何CGI变量可用吗?它可用,但它是[空字符串]
。我想这是因为我使用的是IIS 7.5,请参阅论坛。我很好奇你为什么会使用setVariable()。作为CF开发人员10多年来,我从未使用过该函数。这是一个坏习惯。类似于stData[listfirst(…
的东西也会起作用