Как я могу отправить переменную массива в удаленный метод ColdFusion CFC через ajax с помощью jQuery?
У меня есть функция CFC ColdFusion:
<cffunction access="remote" name="getResults"
returntype="struct"
returnformat="JSON"
output="no">
<cfargument name="q" required="true" type="array" />
...
</cffunction>
Как мне вызвать эту функцию из jQuery? Ни одна форма кодирования массива jQuery не заставит ColdFusion видеть значение как массив.
Если вы передадите "q = a & q = b" (например, с jQuery.ajaxSettings.traditional = true), функция получит строку "a, b", а не массив. Хотя разделение на запятую может показаться возможной, оно не будет работать, если одно из значений "q" содержит запятую. Кроме того, в идеале, функция на стороне сервера не должна знать о проблемах, связанных с сериализацией данных по проводу, и должна продолжать принимать массив.
Если вы передадите "q [] = a & q [] = b" (по умолчанию jQuery), он не будет привязан к параметру "q" . Если вы попытаетесь изменить имя параметра "q" на "q []", CFC выйдет из-за неправильного имени параметра.
Ответы
Ответ 1
Первое, что нужно знать, - jQuery. Запросы Ajax не кодируют массивы, поэтому вам нужно использовать что-то еще для кодирования данных (здесь используется jquery.JSON.js приведена ниже). Таким образом, с найденным JSON-кодированием я понял правильный синтаксис, работая с cfajaxproxy и изучая URL-адрес, который он создает в Firebug:
http://localhost/remote.cfc?method=getResults&argumentCollection=%7B%22q%22%3A%5B1%2C2%5D%7D
Да, подход "argumentcollection" правильный, и здесь есть переменная "q" со ссылкой на массив.
В качестве тестового слоя я использовал следующий код:
remote.cfc
<cfcomponent output="false">
<cffunction access="remote" name="getResults"
returntype="struct"
returnformat="JSON"
output="no">
<cfargument name="q" required="true" type="array" />
<cfreturn {a=1,b=2}>
</cffunction>
</cfcomponent>
remote.cfm, чтобы увидеть, как cfajaxproxy генерирует свой url
<cfajaxproxy cfc="Remote" jsclassname="Remote">
<cfoutput>
<script language="javascript" type="text/javascript">
var oRemote = new Remote();
alert(oRemote.getResults([1,2]));
</script>
</cfoutput>
remote.html делает это с помощью jQuery
<script language="javascript" src="http://code.jquery.com/jquery-1.4.3.min.js"></script>
<script language="javascript" src="jquery.JSON.js"></script>
<script language="javascript" type="text/javascript">
var argumentCollection = { q: [1,2] };
$.ajax({
url: 'remote.cfc',
data: {
method: 'getResults',
argumentCollection: $.JSON.encode(argumentCollection)
},
success: function(response) {
alert(response);
},
dataType: 'json'
});
</script>
Ответ 2
Изучив эту проблему, я нашел следующее сообщение в блоге:
http://www.coldfusionjedi.com/index.cfm/2010/3/23/Using-jQuery-to-post-an-array-to-a-ColdFusion-Component - Предложено кодировать массив как строку JSON, а затем десериализовать его внутри метода CFC, при неудачном воздействии требования CFC функция должна измениться для работы с JSON.
Итак, я исследовал дальше, и здесь лучшее решение, которое я нашел до сих пор.
Изучив HTTP-вызовы, выполненные при использовании cfajaxproxy, я обнаружил, что вы можете отправить один параметр аргументаCollection в виде строки JSON для вызова удаленного метода CFC.
Таким образом, клиентский вызов выглядит примерно так (с помощью jQuery-json-плагина для сериализации):
var params = {q: ['a', '1,2,3']};
$.getJSON('My.cfc?method=getResults', {argumentCollection: $.toJSON(params)}, function(data) {
// handle data
});
Ответ 3
Как насчет проверки ваших значений для запятых и их экранирования перед переходом к Coldfusion, затем используйте ListToArray
для преобразования и (если необходимо) перекодировать запятые?