Javascript에서 쿼리 매개 변수를 만드는 방법은 무엇입니까?


133

GET 요청 을 수행하기위한 쿼리 매개 변수 를 작성하는 방법이 있습니까?JavaScript에서 있습니까?

파이썬에서와 마찬가지로 urllib.urlencode(), 사전 (또는 두 개의 튜플 목록)을 가져 와서 같은 문자열을 만듭니다 'var1=value1&var2=value2'.

답변:


189

여기 있습니다 :

function encodeQueryData(data) {
   const ret = [];
   for (let d in data)
     ret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));
   return ret.join('&');
}

용법:

const data = { 'first name': 'George', 'last name': 'Jetson', 'age': 110 };
const querystring = encodeQueryData(data);

12
로 반복 할 때 hasOwnPropertyfor사용 하여 상호 운용성을 보장하십시오.
troelskn

3
@troelskn, 좋은 지적 ...이 경우 누군가 누군가 Object.prototype을 확장하여 그것을 깨뜨려야 할 것입니다.
Shog9

1
@ Shog9 왜 이데아가 나쁜가요?
Cesar Canassa

@Cesar은 다음을 참조하십시오 stackoverflow.com/questions/3832617/... **
Shog9

작은 세부 사항이지만 ret은 const
Alkis Mavridis

85

URLSearchParams 는 브라우저 지원을 증가시키고 있습니다.

const data = {
  var1: 'value1',
  var2: 'value2'
};

const searchParams = new URLSearchParams(data);

// searchParams.toString() === 'var1=value1&var2=value2'

Node.js는 querystring 모듈을 제공합니다 .

const querystring = require('querystring');

const data = {
  var1: 'value1',
  var2: 'value2'
};

const searchParams = querystring.stringify(data);

// searchParams === 'var1=value1&var2=value2'

1
깨끗하고 현대적인 접근 방식. 나중에 자유롭게 전화 할 수도 있습니다searchParams.append(otherData)
kano

81

기능의

function encodeData(data) {
    return Object.keys(data).map(function(key) {
        return [key, data[key]].map(encodeURIComponent).join("=");
    }).join("&");
}   

1
좋은 것! .map ()은 JavaScript 1.6에서 구현되었으므로 거의 모든 브라우저, 심지어 할머니 브라우저에서도 지원합니다. 그러나 당신이 짐작할 수 있듯이 IE는 IE 9 이상을 제외하지 않습니다. 그러나 걱정하지 마십시오. 해결 방법이 있습니다. 출처 : developer.mozilla.org/en-US/docs/JavaScript/Reference/…
Akseli Palén

var data = { bloop1: true, bloop2: "something" }; var url = "https://something.com/?"; var params = encodeData(data); var finalUrl = url + params; // Is this the right use?생산해야합니까 https://www.something.com/?bloop1=true&bloop2=something?
dylanh724

1
@DylanHunt : 예…
Przemek

38

Zabba 는 현재 받아 들여진 대답에 대한 의견으로 나에게 최고의 솔루션이라는 제안을 제공했습니다 : use jQuery.param () .

jQuery.param()원래 질문의 데이터를 사용 하면 코드는 다음과 같습니다.

const params = jQuery.param({
    var1: 'value',
    var2: 'value'
});

변수 params

"var1=value&var2=value"

보다 복잡한 예제, 입력 및 출력은 jQuery.param () 설명서를 참조하십시오 .


10

우리는 방금 이 문제를 해결하는 것을 목표로하는 프로젝트 arg.js를 출시 했습니다 . 전통적으로 너무 어려웠지만 이제는 할 수 있습니다.

var querystring = Arg.url({name: "Mat", state: "CO"});

그리고 독서 작품 :

var name = Arg("name");

또는 전체를 얻는 것 :

var params = Arg.all();

당신은 차이점을 걱정하는 경우 ?query=true#hash=true다음은 사용할 수 있습니다 Arg.query()Arg.hash()방법을.


9

이것은 일을해야합니다 :

const createQueryParams = params => 
      Object.keys(params)
            .map(k => `${k}=${encodeURI(params[k])}`)
            .join('&');

예:

const params = { name : 'John', postcode: 'W1 2DL'}
const queryParams = createQueryParams(params)

결과:

name=John&postcode=W1%202DL

1
나중에 실제로는 @manav의 응답과 약간 다른 버전이라는 것을 깨달았습니다. 그러나 어쨌든 ES6 구문에는 여전히 바람직 할 수 있습니다.
noego

우선, 키를 인코딩하지 않습니다. 또한 encodeURIComponent()대신에 사용해야 합니다 encodeURI. 차이점에 대해 읽으십시오 .
Przemek

9

ES2017 (ES8)

를 사용 Object.entries()하면 객체 [key, value]쌍 의 배열이 반환 됩니다. 예를 {a: 1, b: 2}들어을 반환 [['a', 1], ['b', 2]]합니다. IE에서만 지원되지 않으며 지원되지 않습니다.

암호:

const buildURLQuery = obj =>
      Object.entries(obj)
            .map(pair => pair.map(encodeURIComponent).join('='))
            .join('&');

예:

buildURLQuery({name: 'John', gender: 'male'});

결과:

"name=John&gender=male"

8

당신이 사용하는 경우 프로토 타입Form.serialize은

당신이 사용하는 경우 jQuery를아약스 / 직렬화

나는 이것을 달성하기위한 독립적 인 기능을 모른다.하지만 구글 라이브러리 검색은 현재 라이브러리를 사용하지 않는다면 유망한 옵션을 찾았다. 하지만 그렇지 않다면, 그들은 하늘이기 때문에 정말로해야합니다.


6
jQuery.param ()은 객체를 가져 와서 GET 쿼리 문자열로 변환합니다 (이 함수는 질문과 더 잘 일치합니다).
azurkin

5

이 10 살짜리 질문을 다시 방문하고 싶습니다. 이 기성 프로그래밍 시대에 가장 좋은 방법은 종속성 관리자 ( npm)를 사용하여 프로젝트를 설정하는 것 입니다. 쿼리 문자열을 인코딩하고 모든 주요 사례를 처리하는 라이브러리의 전체 코티지 산업이 있습니다. 이것은 가장 인기있는 것 중 하나입니다.

https://www.npmjs.com/package/query-string


매우 구체적이지 않은 답변.
masterxilo

2

타이프 스크립트에 약간의 수정 :

  public encodeData(data: any): string {
    return Object.keys(data).map((key) => {
      return [key, data[key]].map(encodeURIComponent).join("=");
    }).join("&");
  }

-11

스레드 는 PHP에서 URL을 이스케이프 처리하기위한 일부 코드를 가리 킵니다. 있다 escape()unescape()대부분의 작업을 할 것이다, 그러나 당신은 몇 가지 여분의 물건을 추가 할 필요가있다.

function urlencode(str) {
str = escape(str);
str = str.replace('+', '%2B');
str = str.replace('%20', '+');
str = str.replace('*', '%2A');
str = str.replace('/', '%2F');
str = str.replace('@', '%40');
return str;
}

function urldecode(str) {
str = str.replace('+', ' ');
str = unescape(str);
return str;
}

3
encodeURIComponent는 이것을 처리하고 공백에 +를 잘못 사용하지 않습니다.
AnthonyWJones
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.