쿼리 문자열 내에 배열을 전달하는 방법은 무엇입니까?


353

쿼리 문자열을 통해 배열을 전달하는 표준 방법이 있습니까?

분명히하기 위해 여러 값을 가진 쿼리 문자열이 있는데 그중 하나는 배열 값입니다. 해당 쿼리 문자열 값을 배열로 취급하고 싶습니다. 다른 쿼리 문자열 변수와 구분할 수 없도록 배열을 분해하고 싶지 않습니다.

또한이 게시물 답변 에 따르면 저자는 배열에 대한 쿼리 문자열 지원이 정의되어 있지 않다고 제안합니다. 이것이 정확합니까?

편집하다:

@Alex의 답변을 바탕 으로이 작업을 수행하는 표준 방법이 없으므로 내 후속 조치는 내가 읽고있는 매개 변수가 PHPJavascript 모두의 배열 임을 인식 하는 쉬운 방법 입니까?

여러 매개 변수의 이름을 같은 이름으로 지정할 수 있습니까? 그러면 매개 변수가 배열에 속한다는 것을 알 수 있습니까? 예:

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

아니면 이것이 나쁜 습관입니까?


어떤 프레임 워크를 사용하고 있습니까? 일부 프레임 워크에는 배열을 쿼리 문자열에 전달하는 데 도움이되는 메소드가 있습니다.
keyboardP

@ keyboardP- 사용 사례에 따라 PHP 및 Javascript
Yarin

2
왜 필요할까요 당신은 할 수있을 때 :에서 myArray = 값 1, 값, VALUE3
Serodis

18
@seroids : 쉼표, 물음표, 등호 및 인쇄 할 수없는 문자를 전달해야하는 경우 어떻게해야합니까?
Berry Tsakala 2016 년

답변:


429

내가 알아 낸 것은 다음과 같습니다.

GET / POST 변수를 통해 배열을 제출하는 것과 같이 다중 값 양식 필드를 제출하는 것은 표준이 반드시 철자가 아니기 때문에 여러 가지 방법으로 수행 할 수 있습니다.

다중 값 필드 또는 배열을 보내는 세 가지 방법은 다음과 같습니다.

  • ?cars[]=Saab&cars[]=Audi (가장 좋은 방법-PHP는 이것을 배열로 읽습니다)
  • ?cars=Saab&cars=Audi (나쁜 방법-PHP는 마지막 값만 등록합니다)
  • ?cars=Saab,Audi (이것을 시도하지 않았습니다)

형태 예

양식에서 다중 값 필드는 선택 상자 의 형식 을 multiple으로 설정할 수 있습니다 .

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

(참고 :이 경우 some_name[]결과 요청 변수가 PHP에 의해 배열로 등록되도록 select control의 이름을 지정하는 것이 중요합니다 )

... 또는 같은 이름을 가진 여러 개의 숨겨진 필드로 :

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

참고 :field[] 여러 값에 사용 하는 것은 실제로 문서화되어 있지 않습니다. Query string-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 []"쿼리 매개 변수를 배열로 자동 변환한다고 생각합니다. 다른 사람들은 그렇지 않습니다.
Carl G

3
nodejs querystring 모듈은 다음 ?cars=Saab&cars=Audi형식을 사용합니다
SystemParadox

53
특급 (Node.js를)에서 두 ?cars=Saab&cars=Audi?cars[]=Saab&cars[]=Audi배열로 바뀌 얻을. 그러나 ?cars=Saab문자열로 끝나지만 ?cars[]=Saab단일 요소가 포함 된 배열입니다.
Trevor Dixon

5
이 방법을 사용하여 키를 설정할 수 있습니까? 다차원 배열은 어떻습니까?
Qwerty

5
ASP.NET MVC가 형식을 읽지 않는 것 같습니다. ?cars[]=Saab&cars[]=Audi제동이 없거나 대괄호 색인이 필요합니다.
Mr. Flibble

37

쿼리 문자열은 텍스트 데이터를 전달하므로 배열을 분해하고 올바르게 인코딩하고 원하는 표현 형식으로 전달하는 것 외에는 옵션이 없습니다.

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

그런 다음 서버 측 코드에서 디코딩하십시오.


설명 주셔서 감사합니다. 수정 된 질문을 볼 수 있습니까? 키에 대해 p1 ... pn을 수행해야합니까, 아니면 여러 키의 이름을 'p'로 지정할 수 있습니까? 그러면 모든 키가 동일한 배열에 속한다는 것을 알 수 있습니까?
Yarin

1
같은 이름을 사용할 수 있습니다. stackoverflow.com/questions/2203430/… 또는 단지 p = aa, bb, cc는 Serodis가 언급 한 가장 확실한 방법입니다.
Alex K.

매우 유용 JSON.stringify하고 JSON.parse!
charliebrownie

1
간단하고 일반적인 표상 형식은 PHP를 사용하여, JSON이며 json_encode다음 rawurlencodejson_decode다른 페이지에.
Edward

20

나는 표준이 없다고 생각합니다.
각 웹 환경은 그러한 것들에 대한 자체 '표준'을 제공합니다. 또한 URL은 일반적으로 너무 짧습니다 (일부 브라우저에서는 256 바이트 제한). 물론 더 긴 배열 / 데이터는 POST 요청과 함께 보낼 수 있습니다.

그러나 몇 가지 방법이 있습니다.

  1. URL 쿼리에 대괄호 ( [, ]) 를 사용하는 PHP 방식이 있습니다 . 예를 들어, ?array_name[]=item&array_name[]=item_2문서화가 잘되지 않았지만 PHP가 자동으로 배열로 변환하는 등의 쿼리 가 작동한다고합니다. 출처 : https://stackoverflow.com/a/9547490/3787376

  2. 객체 데이터 교환 형식 (예 : JSON 공식 웹 사이트 , PHP 문서 )도 JSON과 같이 변수를 문자열로 변환하거나 문자열에서 변환하는 방법이있는 경우 사용할 수 있습니다.
    또한 HTTP get 요청이 문자열 데이터를 올바르게 인코딩하려면 URL 인코더 (대부분의 프로그래밍 언어에 사용 가능)가 필요합니다.

"대괄호 방법"은 간단하고 작동하지만 PHP와 배열로 제한됩니다.
PHP 이외의 언어로 된 쿼리 문자열 내의 클래스 나 변수 전달과 같은 다른 유형의 변수가 필요한 경우 JSON 방법이 권장됩니다.

JSON 메소드의 PHP 예제 (방법 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에서 테스트 된 대괄호 표기법도 지원합니다.
Steve Kehlet

7

쿼리 문자열의 배열을 서블릿에 전달하려는 사람에게 도움이 될 것이라고 생각합니다. 쿼리 문자열 아래에서 테스트했으며 req.getgetParameterValues ​​();를 사용하여 배열 값을 얻을 수있었습니다. 방법. 아래는 브라우저를 통과 한 쿼리 문자열입니다.

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

확인란은 내 매개 변수 배열입니다.


5

이것은 나를 위해 작동합니다 :

링크에서 속성에 값이 있습니다.

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

Route는 이것을 처리 할 수 ​​있습니다 :

path="/filter/:arr"

여러 배열의 경우 :

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

경로는 동일하게 유지됩니다.

스크린 샷

여기에 이미지 설명을 입력하십시오


2

질문에는 PHP와 Javascript를 언급하지만 태그에는 언급하지 않습니다. 배열을 MVC.Net 액션에 전달하려는 의도 로이 질문에 도달했습니다.

내 질문에 대한 답을 여기서 찾았습니다 . 예상 형식은 질문에서 제안한 형식이며 여러 매개 변수가 동일한 이름을 갖습니다.


2
이 링크가 질문에 대한 답변을 제공 할 수 있지만 여기에 답변의 필수 부분을 포함시키고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않을 수 있습니다.
Andrew

@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 를 사용 하여 PHP의 배열에서 URL 인코딩 된 쿼리 문자열을 생성 할 수 있습니다 . 결과 쿼리 문자열이 확장되는 동안 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

?>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.