Указание нескольких параметров с одним и тем же именем с использованием HTTPService - PullRequest
0 голосов
/ 13 ноября 2008

Контроллеры Ruby on Rails автоматически преобразуют параметры в массив, если они имеют определенный формат, например так:

http://foo.com?x[]=1&x[]=5&x[]=bar

Это будет преобразовано в следующий массив:

['1','5','bar']

Есть ли способ сделать это с помощью объекта ActionScript 3 HTTPService, используя параметр запроса? Например, было бы неплохо сделать что-то вроде следующего:

var s:HTTPService = new HTTPService();
s.request['x[]'] = 1;
s.request['x[]'] = 5;
s.request['x[]'] = 'bar';

Однако это просто перезапишет каждое значение, в результате чего будет отправлено только последнее значение. У кого-нибудь есть идея получше? Я знаю, что могу просто добавить что-то в строку запроса, но я бы хотел сделать это в теле сообщения POST.

Ответы [ 4 ]

2 голосов
/ 04 января 2009

Я тоже работал над этой же проблемой. К счастью, Flex поддерживает это "из коробки".

Просто используйте массив для значения поля:

var service:HTTPService = new HTTPService();
service.useProxy = true;
service.destination = "myservicet";
service.resultFormat = HTTPService.RESULT_FORMAT_XML;

var fields:Array = ["categories", "organisation"];
var params:Object = new Object();
params.q = "stackoverflow";
params.rows = 0;
params.facet = "true";
params["facet.field"] = fields;
service.send(params);

HTTPService преобразует следующие параметры URL:

facet=true&q=stackoverflow&facet%2Efield=categories&facet%2Efield=organisation&rows=0

Надеюсь, это поможет!

Добавлено для большей ясности. Если в массиве только 1 аргумент, не передавайте поля как массив. По какой-то причине, flex не отправит это службе http

1 голос
/ 13 ноября 2008

Я обычно делаю что-то вроде этого ...


var s:HTTPService = new HTTPService();
s.url = "http://foo.com";
s.method = "post";
// add listeners...
s.addEventListenser(ResultEvent.RESULT,function(event:ResultEvent){

    mx.controls.Alert.show(event.result.toString());
});

// send the data...
s.send({
    a: 1,
    b: 5,
    c: "bar"
});


, что приведет к HTTP Get / POST:

http://foo.com? А = 1 & Ь = 5 & с = бар

Вы также можете просто создать ассоциативный массив и передать его в метод отправки HTTPService, который будет выглядеть примерно так:



var postdata:Object = {};

postdata["a"] = 1;
postdata["b"] = 5;
postdata["c"] = "bar";

// s is the HTTPService from above...
s.send(postdata);


0 голосов
/ 08 сентября 2009

Давай думать об этом. Почему бы вам не сделать массив всех элементов с одним и тем же индексным именем? Однако это означает, что вы отправляете массив принимающей стороне.

Если вы отправляете это, как это будет ссылаться на URL?

0 голосов
/ 08 сентября 2009

Вы упомянули, что все параметры POST должны иметь одинаковые имена. Элементы с одинаковыми именами будут перезаписывать друг друга в ассоциативном массиве. Однако раньше я имел дело с ячейками календаря, и все 31 ячейка относятся к категории «Дата».

То, что я сделал, было:

var params:Object = new Object;
for (var i:uint=0; i<31; i++){
  params["Date"+(jj.toString())] = date[i];
}

HTTPService....etc.
HTTPService.send(params);

Таким образом, для принимающей стороны POST это будет интерпретироваться как Date0...Date31.

Не знаю, было ли это то, что вы хотели, а пост был так давно.

...