programing

Javascript로 쿼리 문자열을 작성하는 방법

projobs 2023. 2. 3. 21:12
반응형

Javascript로 쿼리 문자열을 작성하는 방법

쿼리 수 Javascript가 뿐입니다.를 들어, Javascript는 다음과 같습니다.예를 들어 다음과 같습니다."var1=value&var2=value2&arr[]=foo&arr[]=bar..."

몇 년 동안 궁금했어요

URLearchParams API는 최신 브라우저 모두에서 사용할 수 있습니다.예를 들어 다음과 같습니다.

const params = new URLSearchParams({
  var1: "value",
  var2: "value2",
  arr: "foo",
});
console.log(params.toString());
//Prints "var1=value&var2=value2&arr=foo"

2k20 업데이트: URLearchParams.toString()과 함께 Josh의 솔루션을 사용합니다.

오래된 답변:


jQuery 없음

var params = {
    parameter1: 'value_1',
    parameter2: 'value 2',
    parameter3: 'value&3' 
};

var esc = encodeURIComponent;
var query = Object.keys(params)
    .map(k => esc(k) + '=' + esc(params[k]))
    .join('&');

하지 않는 의 경우 ES5를 합니다..map...을 잇다

    .map(function(k) {return esc(k) + '=' + esc(params[k]);})

를 사용하는 jQuery를 .jQuery.param() http://api.jquery.com/jQuery.param/httpapi.jquery.com/.param/

예:

var params = {
    parameter1: 'value1',
    parameter2: 'value2',
    parameter3: 'value3' 
};
var query = $.param(params);
console.log(query);

다음과 같이 출력됩니다.

parameter1=value1&parameter2=value2&parameter3=value3

이것은 질문에 직접 답하는 것은 아니지만 쿼리 문자열 매개 변수를 포함하는 URL을 만드는 일반적인 함수가 있습니다.파라미터(이름 및 값)는 URL에 포함시키기 위해 안전하게 이스케이프됩니다.

function buildUrl(url, parameters){
  var qs = "";
  for(var key in parameters) {
    var value = parameters[key];
    qs += encodeURIComponent(key) + "=" + encodeURIComponent(value) + "&";
  }
  if (qs.length > 0){
    qs = qs.substring(0, qs.length-1); //chop off last "&"
    url = url + "?" + qs;
  }
  return url;
}

// example:
var url = "http://example.com/";

var parameters = {
  name: "George Washington",
  dob: "17320222"
};

console.log(buildUrl(url, parameters));
// => http://www.example.com/?name=George%20Washington&dob=17320222

작성하다URLseachParameters

let stringUrl = "http://www.google.com/search";
let url = new URL(stringUrl);
let params = url.searchParams;
params.append("q", "This is seach query");

console.log(url.toString());

출력은 다음과 같습니다.

http://www.google.com/search?q=This+is+seach+query

ES2017(ES8)

를 사용하여 개체의 배열을 반환합니다.[key, value]쌍. 예. pairs. 어. pairs. . pairs. pairs. pairs. pairs.{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"

를 사용하면 를 jQuery로 할 수 .$.param

$.param({ action: 'ship', order_id: 123, fees: ['f1', 'f2'], 'label': 'a demo' })

// -> "action=ship&order_id=123&fees%5B%5D=f1&fees%5B%5D=f2&label=a+demo"

querystring이 도움이 됩니다.

그래서 할 수 있어요

const querystring = require('querystring')

url += '?' + querystring.stringify(parameters)

아니요, 표준 JavaScript에는 이러한 기능이 내장되어 있지 않지만 프로토타입 JS에는 이러한 기능이 있습니다(다른 대부분의 JS 프레임워크에도 있습니다만, 저는 잘 모릅니다). 그들은 이것을 시리얼라이즈라고 부릅니다.

프로토타입 JS를 추천할 수 있습니다. 꽤 잘 작동합니다.유일한 단점은 크기(수백 kb)와 범위(ajax, dom 등의 많은 코드)입니다.따라서 폼시리얼라이저만 원하는 경우에는 오버킬이며, 엄밀히 말하면 Ajax 기능만 원하는 경우에는 오버킬입니다.주의를 기울이지 않으면 너무 많은 "매직"(요소를 찾기 위해 프로토타입 JS 함수로 터치하는 모든 돔 요소를 확장하는 것처럼) 극단적인 경우 속도가 느려질 수 있습니다.

라이브러리를 사용하지 않으려면, 대부분의 동일한 양식 요소 유형을 포함합니다.

function serialize(form) {
  if (!form || !form.elements) return;

  var serial = [], i, j, first;
  var add = function (name, value) {
    serial.push(encodeURIComponent(name) + '=' + encodeURIComponent(value));
  }

  var elems = form.elements;
  for (i = 0; i < elems.length; i += 1, first = false) {
    if (elems[i].name.length > 0) { /* don't include unnamed elements */
      switch (elems[i].type) {
        case 'select-one': first = true;
        case 'select-multiple':
          for (j = 0; j < elems[i].options.length; j += 1)
            if (elems[i].options[j].selected) {
              add(elems[i].name, elems[i].options[j].value);
              if (first) break; /* stop searching for select-one */
            }
          break;
        case 'checkbox':
        case 'radio': if (!elems[i].checked) break; /* else continue */
        default: add(elems[i].name, elems[i].value); break;
      }
    }
  }

  return serial.join('&');
}

엔 즘엔그 you you you you you you you you you 로 할 수 요.FormData ★★★★★★★★★★★★★★★★★」URLSearchParams떤떤 、 루핑루루루루 말이죠죠 。

const formData = new FormData(form);
const searchParams = new URLSearchParams(formData);
const queryString = searchParams.toString();

단, 오래된 브라우저에서는 폴리필이 필요합니다.

다소 중복될 수도 있지만 다음 답변에 기초한 가장 깔끔한 방법입니다.

const params: {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
}

const esc = encodeURIComponent;
const query = Object.keys(params)
  .map(k => esc(k) + '=' + esc(params[k]))
  .join('&');

return fetch('my-url', {
  method: 'POST',
  headers: {'Content-Type': 'application/x-www-form-urlencoded'},
  body: query,
})

원천

저도 잘 모르겠습니다만, jQuery가 어느 정도 한 것은 기억합니다만, php 친화적인 방법은 말할 것도 없고, 계층적인 레코드는 전혀 취급하지 않습니다.

한 가지 확실한 것은 URL을 작성하고 제품을 돔에 꽂을 때 스트링글루만 사용하지 마십시오.그렇지 않으면 편리한 페이지 브레이커를 사용할 수 있습니다.

예를 들어, 특정 애드버타이즈소프트웨어는 플래시를 실행하고 있는 것부터 버전 문자열을 인라인화합니다.일반적인 단순한 스트링을 사용하는 경우는 괜찮지만, Gnash의 버전 스트링은 URL과 <a href> 태그를 포함한 완전한 GPL 저작권 라이선스를 포함하고 있기 때문에 Gnash를 설치한 사람에게는 매우 순진하고 난처한 상황이 됩니다.이것을 문자열 글루 애드버타이저 제너레이터에서 사용하면 페이지가 열리고 HTML이 돔에 불균형하게 표시됩니다.

이 이야기의 교훈은 다음과 같습니다.

   var foo = document.createElement("elementnamehere"); 
   foo.attribute = allUserSpecifiedDataConsideredDangerousHere; 
   somenode.appendChild(foo); 

없음:

   document.write("<elementnamehere attribute=\"" 
        + ilovebrokenwebsites 
        + "\">" 
        + stringdata 
        + "</elementnamehere>");

구글은 이 기술을 배울 필요가 있다.나는 문제를 보고하려고 했지만, 그들은 개의치 않는 것 같다.

프로토타입을 사용하기 위해 실제로 양식이 필요하지 않습니다.오브젝트를 사용합니다.toQueryString 함수:

Object.toQueryString({ action: 'ship', order_id: 123, fees: ['f1', 'f2'], 'label': 'a demo' })

// -> 'action=ship&order_id=123&fees=f1&fees=f2&label=a%20demo'

API는 훌륭한 제안이지만, 아무도 믿을 수 없을 정도로 유용한 것을 언급하지 않았다니 믿을 수 없다..get ★★★★★★★★★★★★★★★★★」.set 쉬울 뿐만 아니라 여러 가지 문제도 할 수 있습니다.쿼리 문자열을 조작하는 데 사용할 수 있으며 사용하기 쉬울 뿐만 아니라 발생할 수 있는 여러 문제를 해결할 수 있습니다.예를 들어, 내 경우 중복된 키를 사용하지 않고 쿼리 문자열을 작성하려고 했습니다. .set이 문제를 해결해 줍니다.MDN 문서에서 인용:

URLearchParams.set() 지정된 검색 파라미터와 관련된 값을 지정된 값으로 설정합니다.여러 개의 값이 있는 경우 다른 값은 삭제됩니다.

예(MDN에서):

let url = new URL('https://example.com?foo=1&bar=2');
let params = new URLSearchParams(url.search);

// Add a third parameter
params.set('baz', 3);

params.toString(); // "foo=1&bar=2&baz=3"

대체, 더 짧은 구문:

let url = new URL('https://example.com?foo=1&bar=2');

// Add a third parameter
url.searchParams.set('baz', 3);

url.searchParams.toString(); // "foo=1&bar=2&baz=3"

Stein의 말대로, 당신은 http://www.prototypejs.org에서 javascript 라이브러리 프로토타입을 사용할 수 있습니다.JS를 포함하면 매우 간단합니다.$('formName').serialize()원하는 것을 돌려드립니다!

jQuery를 선호하는 사용자에게는 formSerialize 메서드를 포함하는 http://plugins.jquery.com/project/form, 폼플러그인을 사용합니다.

답장이 많이 늦었다는 건 알지만, 아주 잘 작동합니다.

var obj = {
a:"a",
b:"b"
}

Object.entries(obj).map(([key, val])=>`${key}=${val}`).join("&");

주의: object.value는 키와 값의 쌍을 반환합니다.

위 라인으로부터의 출력은 a=a&b=b가 됩니다.

도움이 됐으면 좋겠는데

해피 코딩...

아마 네 질문에 답하기에는 너무 늦은 것 같아.
저도 같은 질문이 있어서 URL을 만들기 위해 문자열을 계속 추가하는 것을 싫어했기 때문에 테크하우스 설명대로 $.param을 사용하기 시작했습니다.
URL을 쉽게 만들 수 있는 URI.js 라이브러리도 찾았습니다.도움이 되는 몇 가지 예가 있습니다.URI.js Documentation 。
그 중 하나를 다음에 나타냅니다.

var uri = new URI("?hello=world");
uri.setSearch("hello", "mars"); // returns the URI instance for chaining
// uri == "?hello=mars"

uri.setSearch({ foo: "bar", goodbye : ["world", "mars"] });
// uri == "?hello=mars&foo=bar&goodbye=world&goodbye=mars"

uri.setSearch("goodbye", "sun");
// uri == "?hello=mars&foo=bar&goodbye=sun"

// CAUTION: beware of arrays, the following are not quite the same
// If you're dealing with PHP, you probably want the latter…
uri.setSearch("foo", ["bar", "baz"]);
uri.setSearch("foo[]", ["bar", "baz"]);`

이러한 답변은 매우 유용하지만, 완전한 URL을 구축하는 데 도움이 될 수 있는 답변을 하나 더 추가하고 싶습니다.이것은 베이스에 도움이 됩니다.url,path,hash그리고.parameters.

var url = buildUrl('http://mywebsite.com', {
        path: 'about',
        hash: 'contact',
        queryParams: {
            'var1': 'value',
            'var2': 'value2',
            'arr[]' : 'foo'
        }
    });
    console.log(url);

npm https://www.npmjs.com/package/build-url 에서 다운로드 할 수 있습니다.

데모:

;(function () {
  'use strict';

  var root = this;
  var previousBuildUrl = root.buildUrl;

  var buildUrl = function (url, options) {
    var queryString = [];
    var key;
    var builtUrl;
    var caseChange; 
    
    // 'lowerCase' parameter default = false,  
    if (options && options.lowerCase) {
        caseChange = !!options.lowerCase;
    } else {
        caseChange = false;
    }

    if (url === null) {
      builtUrl = '';
    } else if (typeof(url) === 'object') {
      builtUrl = '';
      options = url;
    } else {
      builtUrl = url;
    }

    if(builtUrl && builtUrl[builtUrl.length - 1] === '/') {
      builtUrl = builtUrl.slice(0, -1);
    } 

    if (options) {
      if (options.path) {
          var localVar = String(options.path).trim(); 
          if (caseChange) {
            localVar = localVar.toLowerCase();
          }
          if (localVar.indexOf('/') === 0) {
              builtUrl += localVar;
          } else {
            builtUrl += '/' + localVar;
          }
      }

      if (options.queryParams) {
        for (key in options.queryParams) {
          if (options.queryParams.hasOwnProperty(key) && options.queryParams[key] !== void 0) {
            var encodedParam;
            if (options.disableCSV && Array.isArray(options.queryParams[key]) && options.queryParams[key].length) {
              for(var i = 0; i < options.queryParams[key].length; i++) {
                encodedParam = encodeURIComponent(String(options.queryParams[key][i]).trim());
                queryString.push(key + '=' + encodedParam);
              }
            } else {              
              if (caseChange) {
                encodedParam = encodeURIComponent(String(options.queryParams[key]).trim().toLowerCase());
              }
              else {
                encodedParam = encodeURIComponent(String(options.queryParams[key]).trim());
              }
              queryString.push(key + '=' + encodedParam);
            }
          }
        }
        builtUrl += '?' + queryString.join('&');
      }

      if (options.hash) {
        if(caseChange)
            builtUrl += '#' + String(options.hash).trim().toLowerCase();
        else
            builtUrl += '#' + String(options.hash).trim();
      }
    } 
    return builtUrl;
  };

  buildUrl.noConflict = function () {
    root.buildUrl = previousBuildUrl;
    return buildUrl;
  };

  if (typeof(exports) !== 'undefined') {
    if (typeof(module) !== 'undefined' && module.exports) {
      exports = module.exports = buildUrl;
    }
    exports.buildUrl = buildUrl;
  } else {
    root.buildUrl = buildUrl;
  }
}).call(this);


var url = buildUrl('http://mywebsite.com', {
		path: 'about',
		hash: 'contact',
		queryParams: {
			'var1': 'value',
			'var2': 'value2',
			'arr[]' : 'foo'
		}
	});
	console.log(url);

var params = { width:1680, height:1050 };
var str = jQuery.param( params );

console.log(str)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

언급URL : https://stackoverflow.com/questions/316781/how-to-build-query-string-with-javascript

반응형