2

我是矩阵参数的新手,我知道 CF10 可以通过他们新的 RESTful API 支持访问它们。

但是,有没有办法在不使用 RESTful API 支持的情况下访问这些参数?

例如http://moremaps.com/map/color.cfm;lat=50;long=20;scale=32000

4

2 回答 2

1

您可以通过 访问它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 注入攻击。

于 2013-10-08T19:14:46.333 回答
1

您可以使用:

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>
于 2013-10-09T10:04:45.057 回答