Отправка HTTP-запроса с несколькими параметрами с одинаковым именем - PullRequest
7 голосов
/ 02 декабря 2009

Мне нужно отправить HTTP-запрос (и получить XML-ответ) от Flash, который выглядит примерно так:

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-запросы. Есть альтернативы?

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

Ответы [ 4 ]

5 голосов
/ 14 декабря 2009

Стандартный http способ отправки данных массива -

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

Но это тоже не так (добавлено из комментария):

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

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

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

2 голосов
/ 14 декабря 2009

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

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

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

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

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

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

1 голос
/ 13 декабря 2009

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

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

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

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

req.decode("someParam1=foo&someParam1=bar&someParam1=bas");
0 голосов
/ 03 декабря 2009

Вы не можете использовать 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();

Отправляемая вами строка:

<root>
  <data>1</data>
  <data>2</data>
  <data>3</data>
</root>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...