2009-12-02 3 views
3

мне нужно отправить запрос HTTP (и получить ответ XML) из флэш-памяти, который выглядит похоже на следующее:Отправка запроса HTTP с несколькими параметрами, имеющие то же имя

http://example.com/somepath?data=1&data=2&data=3 

Т.е. имея несколько параметров, которые имеют одно и то же имя, но имеют разные значения.

До сих пор я использовал следующий код, чтобы сделать HTTP запросы:

var resp:XML = new XML(); 
resp.onLoad = function(success:Boolean) {/*...*/}; 
resp.ignoreWhite = true; 

var req:LoadVars = new LoadVars(); 
req["someParam1"] = 3; 
req["someParam2"] = 12; 

req.sendAndLoad("http://example.com/somepath", resp, "GET"); 

В данном случае это не будет делать: там будет только один параметр, имеющий последнее значение.

Какие у меня варианты? Я использую ActionScript 2.

Добавлено

Я думаю, что я могу сделать что-то вроде этого:

var url:String = myCustomFunctionForBuildingRequestString(); 
var resp:XML = new XML(); 
resp.onLoad = function(success:Boolean) {/*...*/}; 
resp.load(url); 

Но в этом случае я теряю способность делать запросы POST. Любые альтернативы?

Изменение запроса не подходит.

ответ

1

Хотя POST может иметь несколько значений для того же ключа, я был бы осторожен, используя его, поскольку некоторые серверы не могут даже правильно обращаться с этим, что, вероятно, почему это не поддерживается ... если вы конвертируете «повторяющиеся» параметры в список, все дело m начинайте задыхаться, если параметр приходит только один раз, и suddendly вы завершаете строку или что-то в этом роде ... но я думаю, вы знаете, что делаете ...

Прошу прощения, но то, что вы хотите сделать, невозможно в чистом AS2 ...только 2 класса доступны для HTTP: LoadVars и XML ... технически есть также loadVariables, но он просто скопирует свойства из переданного объекта в запрос, который не изменит вашу проблему, так как свойства уникальны ...

если вы хотите придерживаться AS2, вам нужен посредник яруса:

  1. сервер для переадресации вызовов. если у вас есть доступ к серверу, вы создаете новую конечную точку для клиентов AS2, которая будет декодировать запросы и передавать их в обычную конечную точку.
  2. использовать javascript. с flash.external::ExternalInterface вы можете вызвать код JavaScript. Вам нужно определить обратный вызов для выполнения операции, а также функцию JavaScript, которую вы можете вызвать (есть другие способы, но этого должно быть достаточно). Создайте строку запроса внутри флеш-памяти, загрузите ее на JavaScript и позвольте JavaScript отправить ее на сервер в запросе POST и вернуть ответ обратно через обратный вызов.

до вас, чтобы решить, какой из них больше работы ...

примечание стороны: в AS3, вы будете использовать flash.net::URLLoader с dataFormat набором для flash.net::URLLoaderDataFormat.TEXT, а затем снова кодировать параметры в строку , и отправить их.

0

Вы не можете использовать loadvars, как это - потому что data может быть 1 или 2 или 3, не все из них одновременно.

Вы можете либо передать его в качестве разделенных запятыми:

var req:LoadVars = new LoadVars(); 
req["data"] = "1,2,3"; 

или в виде строки XML, и разобрать его на сервере. Я не знаком с манипулирования XML в AS2, но это, как вы могли бы сделать это в AS3:

var xml:XML = <root/>; 
xml.appendChild(<data>1</data>); 
xml.appendChild(<data>2</data>); 
xml.appendChild(<data>3</data>); 

//now pass it to loadvars 
req["data"] = xml.toXMLString(); 

Строка отправленное:

+0

Я знаю, что не могу сделать это с LoadVars, вот почему я задаю вопрос. Я имею в виду, LoadVars, очевидно, не единственный метод для отправки HTTP-запросов. К сожалению, ни конкатенация параметров в одиночный, ни запрос отправки как XML не подходит. – n0rd

+0

Опять же, мой AS2 ограничен, но любой метод, который вы используете для отправки данных, ** одна переменная может содержать только одно значение **, и поэтому вы должны сделать некоторую кодировку, такую ​​как конкатенация или xml или json-массивы, чтобы выполнить это. – Amarghosh

+0

Я не спрашиваю о переменных, я хочу иметь несколько параметров запроса с тем же именем, которые совершенно не связаны с переменными, если только кто-то (что имеет место с LoadVars) по неизвестным причинам решает сделать взаимно однозначное соответствие между их. – n0rd

1

Отказ от ответственности; Я никогда не использовал ActionScript и не имею средств для тестирования этого.

Внесение такого же имени переменной в несколько строк в строку запроса является стандартным способом отправки многозначных переменных (например, флажков формы) на веб-серверы. Если LoadVars может передавать несколько значений, то это кажется правдоподобным, что значения должны храниться в массиве:

req["someParam1"] = ["foo","bar","bas"]; 

Там также, кажется, быть decode функцией LoadVars, что произойдет, если вы пытаетесь импортировать строку запроса вы хотите в объект ?:

req.decode("someParam1=foo&someParam1=bar&someParam1=bas"); 
+0

К сожалению, когда вы назначаете массив для запроса параметра, он делает что-то вроде array.join (",") (ну, вероятно, он называет его методом toString()) и присваивает ему запрос параметра (т. Е. Имеется один одинарный параметр с запятой, разделенные значения). Если вы декодируете строку, вы получите значение типа string, которое равно последнему из значений параметров (например, это будет «bas»). Похоже, что LoadVars не может отправлять такие запросы по дизайну. – n0rd

+0

Действительно, внутреннее представление должно быть отображением из строки в строку. Вам придется либо построить строку запроса, используя какой-либо другой инструмент, либо декодировать различные значения на сервере. –

2

стандарт HTTP способ передачи данных массива является

http://example.com/?data[0]=1&data[1]=2 

Но это не является неправильным либо (добавлено от комментариев):

http://example.com/?data[]=1&data[]=2 

Отправка больше параметров с таким же именем, как и вы» re doing, на практике означает, что все, кроме последнего элемента, следует игнорировать. Это связано с тем, что при чтении переменных сервер перезаписывает (в памяти) любой элемент с таким же именем, как и тот, потому что переименование переменной не является хорошей практикой и никогда не было.

Я не знаю много AS (none: p), но вы получите доступ к нему как к списку или массиву или к каким бы то ни было структурам данных.

+0

+1, хотя на самом деле я думал, что это будет http://example.com/?data[]=1&data[]=2, тогда как то, что вы написали, предназначено для разреженных или ассоциативных массивов ... у вас есть источник, что все элементы, кроме последнего, следует игнорировать? многие серверы действуют таким образом, но я не мог найти никаких спецификаций, требующих этого ... – back2dos

+0

Я немного отредактировал предложение. Я не знаю никаких спецификаций, говорящих об этом, я добавил «на практике». –

+0

И о разреженных массивах ... это не то, что сервер должен заботиться о том, что [] означает «добавить к массиву». И если вы собираетесь отправить две тысячи предметов, тогда есть лучшие способы. ;) –

Смежные вопросы