Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Url 是否可以在ColdFusion中访问矩阵参数(名称-值对以分号分隔)?_Url_Coldfusion_Uri_Cfml - Fatal编程技术网

Url 是否可以在ColdFusion中访问矩阵参数(名称-值对以分号分隔)?

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.

我是新手,我知道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.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(…
的东西也会起作用