Как я могу получить (квази) массив из строки URL? - PullRequest
1 голос
/ 15 июня 2011

Я хотел бы добиться чего-то, что я могу легко сделать в .net.

Что я хотел бы сделать, это передать несколько параметров URL с одним и тем же именем для создания массива этих значений.

Другими словами, я хотел бы взять строку URL следующим образом:

http://www.example.com/Test.cfc?method=myArrayTest&foo=1&foo=2&foo=3

И построить массив из параметра URL "foo".

В .net / C # я могу сделать что-то вроде этого:

[WebMethod]
myArrayTest(string[] foo)

И этосоздаст строковый массив из переменной "foo".

То, что я сделал до сих пор, выглядит примерно так:

<cffunction name="myArrayTest" access="remote" returntype="string">
    <cfargument name="foo" type="string" required="yes">

Это приведет к выводу:

1,2,3

Я не в восторге от этого, потому что это просто строка, разделенная запятыми, и я боюсь, что в URL могут быть переданы запятые (конечно, закодированные), а затем, если я попытаюсь зациклить запятые, это может быть неправильно истолкованоотдельный параметр.

Итак, я нахожусь в тупике, как этого добиться.

Есть идеи ??

Заранее спасибо !!

Ответы [ 3 ]

3 голосов
/ 15 июня 2011

Редактировать: Метод Сергея более универсален. Но если вы анализируете текущий URL-адрес, и не необходимо изменить результирующий массив, другой вариант использует getPageContext () для извлечения параметра из базового запроса. Просто знайте о двух причудах, отмеченных ниже.

<!--- note: duplicate forces the map to be case-INsensitive --->
<cfset params = duplicate(getPageContext().getRequest().getParameterMap())>
<cfset quasiArray = []>
<cfif structKeyExists(params, "foo")>
    <!--- note: this is not a *true* CF array --->
    <!--- you can do most things with it, but you cannot append data to it --->
    <cfset quasiArray = params["foo"]>
</cfif>
<cfdump var="#quasiArray#">
2 голосов
/ 15 июня 2011

Что ж, если вы в порядке разбора URL, вам может подойти следующий «сырой» метод:

<cffunction name="myArrayTest" access="remote" output="false">

    <cfset var local = {} />

    <!--- parse raw query --->
    <cfset local.args = ListToArray(cgi.QUERY_STRING, "&") />

    <!--- grab only foo's values --->
    <cfset local.foo = [] />
    <cfloop array="#local.args#" index="local.a">
        <cfif Left(local.a, 3) EQ "foo">
            <cfset ArrayAppend(local.foo, ListLast(local.a, "=")) />
        </cfif>
    </cfloop>

    <cfreturn SerializeJSON(local.foo) />

</cffunction>

Я проверил его с помощью этого запроса: ?method=myArrayTest&foo=1&foo=2&foo=3,3, выглядит так, как ожидалось.

Бонус. Главный совет Railo: если вы отформатируете запрос следующим образом, этот массив будет создан автоматически в области URL ?method=myArrayTest&foo[]=1&foo[]=2&foo[]=3,3.

0 голосов
/ 15 июня 2011

listToArray( arguments.foo ) должен дать вам то, что вы хотите.

...