JavaScriptでクエリパラメータを作成する方法


132

作成するにはどのような方法があり、クエリパラメータ行うためのGETリクエスト JavaScriptでは?

Pythonと同じようにurllib.urlencode()、は辞書(または2つのタプルのリスト)を受け取り、のような文字列を作成します'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
で反復する場合はfor、相互運用性を確保するためにhasOwnPropertyを使用します。
troelskn 2008

3
@troelskn、良い点...この場合、誰かがObject.prototypeを拡張してそれを壊さなければならないでしょうが、それは最初からかなり悪い考えです。
Shog9 2008

1
@ Shog9なぜそれが悪いアイディアなのか?
Cesar Canassa 2011

@Cesarは、以下を参照してください。stackoverflow.com/questions/3832617/... **
Shog9

ほんの少しの詳細ですが、retはconstになる可能性があります
Alkis Mavridis

84

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/...
AkseliPalé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 2017年

1
@DylanHunt:うん…
Przemek '20年

38

Zabbaは、現在受け入れられている回答に関するコメントで、私にとっては最善の解決策である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を使用している場合は、Ajax / serializeがあります。

私はこれを達成するための独立した関数を知りませんが、それをグーグル検索すると、現在ライブラリを使用していない場合にいくつかの有望なオプションが見つかりました。もしそうでなければ、彼らは天国なので、本当にそうすべきです。


5
jQuery.param()はオブジェクトを受け取り、それをGETクエリ文字列に変換します(この関数は質問によりよく一致します)。
azurkin

5

このほぼ10年前の質問を再訪したいだけです。この既製のプログラミングの時代では、依存関係マネージャ(npm)を使用してプロジェクトをセットアップするのが最善の策です。クエリ文字列をエンコードし、すべてのエッジケースを処理するライブラリのコテージ業界全体があります。これは、最も人気のあるものの1つです。

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


非常に不明確な答え。
masterxilo

2

typescriptを少し変更します。

  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 2008
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.