Як передати масив у рядку запиту?


353

Чи існує стандартний спосіб передачі масиву через рядок запиту?

Щоб було зрозуміло, у мене є рядок запиту з декількома значеннями, одним з яких буде значення масиву. Я хочу, щоб це значення рядка запиту трактувалося як масив. Я не хочу, щоб масив був підірваний таким чином, щоб він не відрізнявся від інших змінних рядків запиту.

Також, відповідно до цієї відповіді на пост , автор пропонує, що підтримка рядків запиту для масивів не визначена. Це точно?

Редагувати:

Виходячи з відповіді @ Alex, немає стандартного способу зробити це, тому моє подальше спостереження - це простий спосіб визнати, що параметр, який я читаю, це масив як PHP, так і Javascript ?

Чи було б прийнятним називати кілька парамерів тим самим іменем, і таким чином я б знав, що вони належать до масиву? Приклад:

?myarray=value1&myarray=value2&myarray=value3...

Або це була б погана практика?


Яку основу ви використовуєте? У деяких фреймворках є методи, що допомагають передавати масиви запитам.
клавіатураP

@ keyboardP- PHP та Javascript, залежно від випадку використання
Yarin

2
Чому б ти хотів це робити, коли ти міг просто зробити:? Myarray = value1, value2, value3
Serodis

18
@seroids: що робити, якщо йому доведеться пропускати коми, знаки запитань, рівні знаки та символи, що не друкуються?
Беррі Цакала

Відповіді:


429

Ось що я з’ясував:

Подання полів форми з великим значенням, тобто подання масивів через GET / POST vars, можна виконати декількома різними способами, оскільки стандарт не обов'язково прописаний.

Три можливі способи надіслати багатозначні поля або масиви:

  • ?cars[]=Saab&cars[]=Audi (Найкращий спосіб - PHP читає це в масив)
  • ?cars=Saab&cars=Audi (Поганий спосіб - PHP реєструє лише останнє значення)
  • ?cars=Saab,Audi (Я цього не пробував)

Приклади форм

У формі багатозначні поля можуть мати вигляд вікна вибору, встановленого на кілька :

<form> 
    <select multiple="multiple" name="cars[]"> 
        <option>Volvo</option> 
        <option>Saab</option> 
        <option>Mercedes</option> 
    </select>
</form>

(ПРИМІТКА. У цьому випадку було б важливо назвати елемент вибору some_name[], щоб отриманий запит vars був зареєстрований як масив PHP)

... або як кілька прихованих полів з однаковою назвою :

<input type="hidden" name="cars[]" value="Volvo">
<input type="hidden" name="cars[]" value="Saab">
<input type="hidden" name="cars[]" value="Mercedes">

ПРИМІТКА. Використання field[]для кількох значень дійсно погано зафіксовано. Я не бачу жодної згадки про це в розділі про багатозначні ключі в рядку Query - Wikipedia , або в документах W3C, що займаються введеннями з декількома виборами.


ОНОВЛЕННЯ

Як зазначають коментатори, це дуже важливо для рамки. Деякі приклади:

Рядок запиту:

?list_a=1&list_a=2&list_a=3&list_b[]=1&list_b[]=2&list_b[]=3&list_c=1,2,3

Рейки:

"list_a": "3", 
"list_b":[
    "1",
    "2",
    "3"
  ], 
"list_c": "1,2,3"

Кутовий:

 "list_a": [
    "1",
    "2",
    "3"
  ],
  "list_b[]": [
    "1",
    "2",
    "3"
  ],
  "list_c": "1,2,3"

(Кутова дискусія )

Дивіться коментарі щодо прикладів у node.js , Wordpress , ASP.net


Підтримання порядку: Ще одна річ, яку слід врахувати, це те, що якщо вам потрібно підтримувати порядок своїх елементів (тобто масив як упорядкований список), у вас дійсно є лише одна опція, яка передає розмежений список значень і явно перетворює його в самі масив.


3
Я думаю, що причиною того, що ця функціональність не задокументована в загальних джерелах, таких як Wiki або W3C, є те, що вона, як правило, не підтримується веб-рамками. PHP, і я думаю, Rails автоматично перетворює декілька параметрів запиту "key []" в масив. Інші - ні.
Карл Г

3
Модуль запиту рядків nodejs використовує ?cars=Saab&cars=Audiформу
SystemParadox

53
У express (node.js) обидва ?cars=Saab&cars=Audiі ?cars[]=Saab&cars[]=Audiперетворюються на масиви. Однак ?cars=Saabзакінчується як рядок, але ?cars[]=Saabє масивом з одним елементом.
Тревор Діксон

5
Чи можете ви встановити ключі, використовуючи такий підхід? А як щодо багатовимірних масивів?
Qwerty

5
Здається, ASP.NET MVC не читає формат. ?cars[]=Saab&cars[]=AudiУ квадратних дужках або квадратних дужок не повинно бути індексів /
Містер Фліббл,

37

Рядок запиту містить текстові дані, тому немає іншого виходу, як вибухнути масив, правильно закодувати його та передати у обраному вами образі:

p1=value1&pN=valueN...
data=[value1,...,valueN]
data={p1:value1,...,pN:valueN}

а потім розшифруйте його у коді сторони вашого сервера.


ОК, дякую за роз’яснення. Чи можете ви побачити моє переглянуте запитання - чи потрібно робити p1 ... pn, для ключів, чи я можу просто назвати кілька клавіш 'p', і таким чином я би знав, що всі вони належать до одного масиву?
Ярін

1
Ви можете використовувати те саме ім’я; stackoverflow.com/questions/2203430/… або просто p = aa, bb, cc, що є найбільш очевидним способом, як коментує Серодіс.
Алекс К.

дуже корисно з JSON.stringifyі JSON.parse!
charliebrownie

1
Простий і поширений формат представлення - JSON, в PHP, використовуючи json_encodeтоді rawurlencodeі json_decodeна іншій сторінці.
Едвард

20

Я не думаю, що існує стандарт.
Кожне веб-середовище забезпечує свій "стандарт" для таких речей. Крім того, URL зазвичай занадто короткий для чого-небудь (обмеження 256 байт у деяких браузерах). Звичайно, довші масиви / дані можуть надсилатися з POST-запитами.

Однак є кілька методів:

  1. Існує спосіб PHP, який використовує квадратні дужки ( [, ]) у запитах URL. Наприклад, такий запит ?array_name[]=item&array_name[]=item_2працює, не дивлячись на те, що він недостатньо документально підтверджений, і PHP автоматично перетворює його в масив. Джерело: https://stackoverflow.com/a/9547490/3787376

  2. Об'єктні формати обміну даними (наприклад, JSON - офіційний веб-сайт , документація PHP ) також можуть використовуватися, якщо у них є методи перетворення змінних в і з рядків, як це робить JSON.
    Також для кодування URL-запиту для отримання HTTP-запитів потрібен URL-кодер (доступний для більшості мов програмування), щоб правильно кодувати рядкові дані.

Хоча "метод квадратних дужок" простий і працює, він обмежений PHP та масивами.
Якщо потрібні інші типи змінних, такі як класи або передачі змінних у рядках запиту мовою, відмінною від PHP, рекомендується метод JSON.

Приклад у PHP методу JSON (метод 2):

$myarray = array(2, 46, 34, "dfg");
$serialized = json_encode($myarray)
$data = 'myarray=' . rawurlencode($serialized);
// Send to page via cURL, header() or other service.

Код сторінки для отримання (PHP):

$myarray = json_decode($_GET["myarray"]); // Or $_POST["myarray"] if a post request.

1
Express.js також підтримує позначення квадратних дужок, протестованих на 4.13.4.
Стів Келет

7

Я вважаю, що було б корисно для того, хто шукає передати масив у рядку запиту до сервлета. Я тестував нижче рядок запиту і зміг отримати значення масиву за допомогою req.getgetParameterValues ​​(); метод. Нижче - рядок запиту, який я пройшов через браузер.

  http://localhost:8080/ServletsTutorials/*.html? 
  myname=abc&initial=xyz&checkbox=a&checkbox=b

checkbox - це мій масив параметрів тут.


5

Це працює для мене:

У посиланні атрибут має значення:

to="/filter/arr?fruits=apple&fruits=banana"

Маршрут може впоратися з цим:

path="/filter/:arr"

Для кількох масивів:

to="filter/arr?fruits=apple&fruits=banana&vegetables=potato&vegetables=onion"

Маршрут залишається однаковим.

ЕКРАН

введіть тут опис зображення


2

Ви згадуєте PHP та Javascript у своєму питанні, але не в тегах. Я підійшов до цього питання з наміром передати масив до дії MVC.Net.

Я знайшов відповідь на своє питання тут : очікуваний формат, який ви запропонували в вашому питанні, з декількома параметрами , що мають таке ж ім'ям.


2
Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться.
Андрій

@Andrew Це не лише посилання. "Очікуваний формат - це той, який ви запропонували у своєму запитанні, при цьому кілька параметрів мають однакову назву."
DCShannon

2

Я використовую React і Rails. Я зробив:

js

  let params = {
    filter_array: ['A', 'B', 'C']
  }

  ...

  //transform params in URI

  Object.keys(params).map(key => {
    if (Array.isArray(params[key])) {
      return params[key].map((value) => `${key}[]=${value}`).join('&')
    }
  }
  //filter_array[]=A&filter_array[]=B&filter_array[]=C

1

Ви можете використовувати http_build_query для створення кодованого URL- адресом запиту з масиву в PHP. У той час як отримана запитна рядок буде розширена, ви можете визначитися з унікальним роздільником, який ви хочете в якості параметра для http_build_queryметоду, тому, коли мова заходить про розшифровку, ви можете перевірити, який роздільник використовувався. Якщо б це було вибране вами унікальне, то це буде запит рядка масиву, інакше це були б звичайні запити рядків.


1

Хоча в частині URL немає стандарту, є один стандарт для JavaScript. Якщо ви передасте об'єктам, що містять масиви URLSearchParams, і зателефонуйте toString()до нього, він перетворить його на список елементів, розділених комами:

let data = {
  str: 'abc',
  arr: ['abc', 123]
}

new URLSearchParams(data).toString();  # ?str=abc&arr=abc,123

0

Перевірте parse_stringфункцію http://php.net/manual/en/function.parse-str.php

Він поверне всі змінні з рядка запиту, включаючи масиви.

Приклад з php.net:

<?php
$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first;  // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz

parse_str($str, $output);
echo $output['first'];  // value
echo $output['arr'][0]; // foo bar
echo $output['arr'][1]; // baz

?>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.