Fetch GETリクエストを使用してクエリ文字列を設定する


148

新しいFetch APIを使用しようとしています

私はGETこのようなリクエストをしています:

var request = new Request({
  url: 'http://myapi.com/orders',
  method: 'GET'
});
fetch(request);

ただし、クエリ文字列をGETリクエストに追加する方法がわかりません。理想的には、いいね!にGETリクエストを送信できるようにしたいですURL

'http://myapi.com/orders?order_id=1'

では、のパラメータとしてjQuery渡すことでこれを行うことができます。新しいものでそれを行う同等の方法はありますか?{order_id: 1}data$.ajax()Fetch API

回答:


173

2017年3月の更新:

URL.searchParamsのサポートがChrome 51に正式に導入されましたが、他のブラウザでは依然としてポリフィルが必要です。


公式のクエリパラメータと仕事への道は、URLにそれらを追加するだけです。仕様から、これは例です:

var url = new URL("https://geo.example.org/api"),
    params = {lat:35.696233, long:139.570431}
Object.keys(params).forEach(key => url.searchParams.append(key, params[key]))
fetch(url).then(/* … */)

ただし、ChromeがsearchParams(執筆時点で)URL のプロパティをサポートしているかどうかは不明なので、サードパーティのライブラリまたは独自のソリューションを使用することをお勧めします。

2018年4月の更新:

URLSearchParamsコンストラクターを使用すると、2D配列またはオブジェクトを割り当て、url.searchすべてのキーをループして追加する代わりに、それに割り当てるだけで済みます。

var url = new URL('https://sl.se')

var params = {lat:35.696233, long:139.570431} // or:
var params = [['lat', '35.696233'], ['long', '139.570431']]

url.search = new URLSearchParams(params).toString();

fetch(url)

URLSearchParamsサイドノート:NodeJSでも利用可能

const { URL, URLSearchParams } = require('url');

1
また、developer.mozilla.org / en-US / docs / Web / API / URLSearchParams /…もあります。これを書いている時点では、まだ仕様を通じて進んでおり、まだ十分にサポートされていません。そして、APIはJSよりもJavaに似ています。:/
ericsoco

1
インターフェースのサポートについては、caniuse.com /#feat = urlsearchparamsを参照してくださいURLSearchParams。(私は100%確実ではありませんが)赤のブラウザには、オブジェクトがプロパティを持たないブラウザが正確に存在すると想定URL.searchParamsます。重要なことに、Edgeはまだサポートされていません。
Mark Amery 2017

1
ドキュメントから:「URLSearchParamsインスタンスの使用は非推奨です。まもなくブラウザはinitにUSVStringを使用するようになります。」ソース:developer.mozilla.org/en-US/docs/Web/API/URLSearchParams/...
pakman

1
new URLSearchParamsArrayプロパティで正しく動作しないようです。プロパティarray: [1, 2]をに変換すると思っていましたarray[]=1&array[]=2が、に変換しましたarray=1,2。そのappendメソッドを手動で使用するとが発生しarray=1&array=2ますが、paramsオブジェクトを反復処理する必要があります。これは、人間工学的ではなく、配列型に対してのみ行う必要があります。
エランドロス

1
実際にエラーで追加されました:) github.com/mdn/sprints/issues/2856
CodingIntrigue

30
let params = {
  "param1": "value1",
  "param2": "value2"
};

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

let url = 'https://example.com/search?' + query;

fetch(url)
  .then(data => data.text())
  .then((text) => {
    console.log('request succeeded with JSON response', text)
  }).catch(function (error) {
    console.log('request failed', error)
  });

26

すでに答えたように、これはfetchまだ仕様では-APIでは不可能です。しかし、私は注意しなければなりません:

にいる場合はnodequerystringパッケージがあります。オブジェクト/クエリ文字列を文字列化/解析できます:

var querystring = require('querystring')
var data = { key: 'value' }
querystring.stringify(data) // => 'key=value'

...次に、リクエストするURLに追加するだけです。


ただし、上記の問題は、常に疑問符(?)を付加する必要があることです。したがって、別の方法はparse、nodes urlパッケージのメソッドを使用して、次のようにすることです。

var url = require('url')
var data = { key: 'value' }
url.format({ query: data }) // => '?key=value'

https://nodejs.org/api/url.html#url_url_format_urlobjを参照queryしてください

内部的にはこれだけなので、これは可能です。

search = obj.search || (
    obj.query && ('?' + (
        typeof(obj.query) === 'object' ?
        querystring.stringify(obj.query) :
        String(obj.query)
    ))
) || ''

25

簡潔なES6アプローチ:

fetch('https://example.com?' + new URLSearchParams({
    foo: 'value',
    bar: 2,
}))

URLSearchParamの toString()関数は、クエリ引数をURLに追加できる文字列に変換します。この例では、toString()は、URLと連結されるときに暗黙的に呼び出されます。

IEはこの機能をサポートしていませんが、利用可能なポリフィルがあります。



5

多分これはより良いです:

const withQuery = require('with-query');

fetch(withQuery('https://api.github.com/search/repositories', {
  q: 'query',
  sort: 'stars',
  order: 'asc',
}))
.then(res => res.json())
.then((json) => {
  console.info(json);
})
.catch((err) => {
  console.error(err);
});

5

encodeQueryString —オブジェクトをクエリ文字列パラメータとしてエンコードします

/**
 * Encode an object as url query string parameters
 * - includes the leading "?" prefix
 * - example input — {key: "value", alpha: "beta"}
 * - example output — output "?key=value&alpha=beta"
 * - returns empty string when given an empty object
 */
function encodeQueryString(params) {
    const keys = Object.keys(params)
    return keys.length
        ? "?" + keys
            .map(key => encodeURIComponent(key)
                + "=" + encodeURIComponent(params[key]))
            .join("&")
        : ""
}

encodeQueryString({key: "value", alpha: "beta"})
 //> "?key=value&alpha=beta"

5

私はこれが絶対に明白なことを述べていることを知っていますが、これは答えの中で最も簡単なので、これを答えとして追加する価値があると感じています。

var orderId = 1;
var request = new Request({
  url: 'http://myapi.com/orders?order_id=' + orderId,
  method: 'GET'
});
fetch(request);

7
これが整数型でのみ確実に機能することを確認する価値があります。文字列を使用する場合、特にユーザー指定の文字列(検索条件など)を使用する場合は、文字列をエスケープする必要があります。それ以外の場合は/+やのような&文字が文字列に表示されると、奇妙な結果が得られます。
Malvineous

Requestオブジェクトを使用すると、特に関数を使用して要求を作成し、それをfetch()呼び出しに渡したい場合に役立ちますが、使用することは「絶対に明白」ではないと思います。また、URLは構成オプションのオブジェクトリテラルで指定しないでください。リクエストコンストラクター(developer.mozilla.org/en-US/docs/Web/API/Request/Request)の最初のパラメーターとして個別に渡す必要があります。
Gen1-1

3

テンプレートリテラルもここでは有効なオプションであり、いくつかの利点があります。

生の文字列、数値、ブール値などを含めることができます。

    let request = new Request(`https://example.com/?name=${'Patrick'}&number=${1}`);

変数を含めることができます。

    let request = new Request(`https://example.com/?name=${nameParam}`);

ロジックと関数を含めることができます。

    let request = new Request(`https://example.com/?name=${nameParam !== undefined ? nameParam : getDefaultName() }`);

より大きなクエリ文字列のデータを構造化する限り、文字列に連結された配列を使用するのが好きです。他の方法よりも理解しやすいと思います。

let queryString = [
  `param1=${getParam(1)}`,
  `param2=${getParam(2)}`,
  `param3=${getParam(3)}`,
].join('&');

let request = new Request(`https://example.com/?${queryString}`, {
  method: 'GET'
});

9
最初に文字列のURLエスケープを行わないため、この方法には十分注意する必要があります。そのため、+またはのような文字を含む変数を取得する&と、期待どおりに機能せず、さまざまなパラメーターと値が思い通りのものになってしまいます。
Malvineous

-1

NativescriptのfetchModuleを操作していて、文字列操作を使用して自分のソリューションを見つけました。クエリ文字列を少しずつURLに追加します。以下は、クエリがjsonオブジェクトとして渡される例です(クエリ= {order_id:1}):

function performGetHttpRequest(fetchLink='http://myapi.com/orders', query=null) {
    if(query) {
        fetchLink += '?';
        let count = 0;
        const queryLength = Object.keys(query).length;
        for(let key in query) {
            fetchLink += key+'='+query[key];
            fetchLink += (count < queryLength) ? '&' : '';
            count++;
        }
    }
    // link becomes: 'http://myapi.com/orders?order_id=1'
    // Then, use fetch as in MDN and simply pass this fetchLink as the url.
}

私はこれを複数のクエリパラメータでテストしましたが、魅力的に機能しました:)これが誰かの助けになることを願っています。


1
これは、サードパーティのライブラリを使用する必要がある理由の良い例です。コードは正常に機能している可能性がありますが、誰かがすでにはるかに優れています
refaelio

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