Feathers: RESTクライアント:大量のGETリクエストのデータまたは本文のパラメーターを受け入れる

作成日 2019年05月27日  ·  3コメント  ·  ソース: feathersjs/feathers

こんにちは、

GETリクエストの長いURLで問題が発生しました。 いくつかの「検索」クエリでパラメータの長いリストを渡す必要があります。

現在の解決策は、新しいミドルウェアとメソッドのオーバーライドを作成することです。

// allow x-http-method-override header for GET methods
exports.default = function (req, res, next) {
    if (req.headers['x-http-method-override'] === 'GET' && req.method === 'POST') {
        req.method = 'GET';
        req.query = req.body;
        delete req.body;
    }
    next();
};

次に、次のようにサービスを利用します。

await awesomeService.create(
          {
             someParam: aVeryLongArray // will replace req.query server side thanks to the middleware, and thus bypass URL limitations of browsers
          },
          {
            headers: {
              "x-http-method-override": "GET" // tell the server that this is actually a GET request, so it triggers our middleware
            }
          }
        );

Slackのヘルプを提供してくれたSebastianに感謝します(GitHubのハンドルが見つかりません)。

このSOの回答によると、POST HTTPワードは作成自体に限定されず、分類できない他の種類のアクションにも関連付けられているため、これは有効なパターンです。 したがって、「パラメータの多い検索」は、POSTの関連するユースケースと見なすことができます。

しかし...問題は、FeathersではPOSTリクエストが「作成」アクションに強く結びついていることです。 RESTクライアントを使用する場合、これは、データを見つけるためにcreateメソッドを使用する必要があることを意味します。これは、サーバー側であり、 createフックに関連するアクセス許可を設定することを意味します。気がかりです。

GETリクエストでbodyまたはdataフィールドをサポートすることを提案します(つまり、 getおよびfindメソッド)。 実装は簡単だと思います(そしてPRしてよかったと思います)が、私は疑問に思います:

  • それが良い考えである場合(主にブラウザーに関して、getリクエストのdataまたはbodyフィールドを削除できますか?)
  • 最良のパターンは何でしょうか( body param、 data param?)

最も参考になるコメント

独自にカスタマイズしたクライアントサービスをより簡単にインスタンス化できるように、RESTクライアントをもう少し柔軟にすることを考えていました。 JSONを使用してクエリをPOSTできるようにすると、URL文字列の変換と配列解析の制限もすべて回避されます。 現時点では、クライアントでRESTサービスをカスタマイズする方法は次のようになります(これは、さまざまなエンドポイントを使用する方法でもあります)。

const FetchService = require('@feathersjs/rest-client/lib/fetch');

class MyFetchService extends FetchService {
  get (id, params = {}) {
    if (typeof id === 'undefined') {
      return Promise.reject(new Error(`id for 'get' can not be undefined`));
    }

    return this.request({
      url: this.makeUrl({}, id),
      method: 'POST',
      data: params.query,
      headers: Object.assign({
        'x-http-method-override': 'GET'
      }, params.headers)
    }, params).catch(toError);
  }
}

app.use('/someservice', new MyFetchService({
  connection: window.fetch,
  name: 'someservice',
  base: 'mybaseUrl',
  options: {}
}));

中断のない変更により、次のことが可能になる可能性があります

const feathers = require('@feathersjs/feathers');
const rest = require('@feathersjs/rest-client');

const app = feathers();

// Connect to the same as the browser URL (only in the browser)
app.configure(rest({
  base: '/',
  Service: MyFetchService
}));

全てのコメント3件

独自にカスタマイズしたクライアントサービスをより簡単にインスタンス化できるように、RESTクライアントをもう少し柔軟にすることを考えていました。 JSONを使用してクエリをPOSTできるようにすると、URL文字列の変換と配列解析の制限もすべて回避されます。 現時点では、クライアントでRESTサービスをカスタマイズする方法は次のようになります(これは、さまざまなエンドポイントを使用する方法でもあります)。

const FetchService = require('@feathersjs/rest-client/lib/fetch');

class MyFetchService extends FetchService {
  get (id, params = {}) {
    if (typeof id === 'undefined') {
      return Promise.reject(new Error(`id for 'get' can not be undefined`));
    }

    return this.request({
      url: this.makeUrl({}, id),
      method: 'POST',
      data: params.query,
      headers: Object.assign({
        'x-http-method-override': 'GET'
      }, params.headers)
    }, params).catch(toError);
  }
}

app.use('/someservice', new MyFetchService({
  connection: window.fetch,
  name: 'someservice',
  base: 'mybaseUrl',
  options: {}
}));

中断のない変更により、次のことが可能になる可能性があります

const feathers = require('@feathersjs/feathers');
const rest = require('@feathersjs/rest-client');

const app = feathers();

// Connect to the same as the browser URL (only in the browser)
app.configure(rest({
  base: '/',
  Service: MyFetchService
}));

こんにちは、私も同じ問題を抱えています。検索リクエストは複数のパラメータを取り込むことができるはずであり、URLの制限に達します。 そのため、POSTを実行して、「作成」ではなく「検索」にルーティングできるかどうかを確認するのに苦労しています。

@ eric-burelが提案したことを試し、HTTPリクエストメソッドタイプをPOSTからGETにオーバーライドしましたが、「find」にルーティングする代わりに、サービスで「create」メソッドを見つけようとして失敗しました。 リクエストオブジェクトメソッドが実際に「GET」に変更されていることを確認しましたが、この変更の前にフェザールーティングが発生する可能性がありますか?

app.use( '/ apointments'、function(req、res、next){
if(req.method === 'POST'){//これはこのサービスに対してのみ実行します。
req.method = 'GET';
req.query = req.body;
req.bodyを削除します。
}
次();
}、{
検索:function(params、callback){
//何かをする
}
});

私がここで何かが足りないかどうか、あなたのどちらかが明確にしてくれませんか? またはさらに良いことに、これを行うためのより良い方法があるかどうか私に知らせてください?

これは、v5に登場する新しいカスタムメソッド(https://github.com/feathersjs/feathers/issues/1976)で実行できます。

このページは役に立ちましたか?
0 / 5 - 0 評価

関連する問題

jordanbtucker picture jordanbtucker  ·  4コメント

arkenstan picture arkenstan  ·  3コメント

rrubio picture rrubio  ·  4コメント

rstegg picture rstegg  ·  3コメント

harrytang picture harrytang  ·  3コメント