Генерация строки запроса для использования в качестве URL для запроса API - PullRequest
0 голосов
/ 28 февраля 2019

Я хочу иметь строку запроса, которую можно использовать для фильтрации моих результатов.Всякий раз, когда URL-адрес изменяется, с помощью Redux вызывается действие для загрузки моих данных с заданными фильтрами в URL.

Пример URL выглядит следующим образом:

/trainers?filter=city=Antwerp&firstName=Dax&lastName=Bosch&postalCode=2600&page=1

С этим данным URL myaction.payload должно выглядеть так:

payload:
  filter: "city=Antwerp&firstName=Dax&lastName=Bosch&postalCode=2600"
  page: 1
  sortField: undefined
  sortOrder: undefined

Вот как я сейчас делаю строку запроса

  filterAdvancedSearch = (values: FormikValues) => {
    updateAdvancedSearchQueryString(this.props, {page: 1, filter: this.filterSearchResults(values)});
  };
  filterSearchResults = (values: any) => {
    let obj: any = {};
    Object.keys(values).forEach(
      key => values[key].length && (obj[key] = values[key])
    );
    return obj;
  };

Я передаю реквизит и мой объект, который будет использоватьсядля генерации строки запроса.filterSearchResults() используется для избавления от пустых значений

Как я создаю строку запроса и отправляю ее на свой маршрут:

export function updateAdvancedSearchQueryString<T>(
  props: RouteComponentProps,
  newValues: any
) {
  props.history.push({
    pathname: props.location.pathname,
    search: queryString.stringify(newValues)
  });
}

Я использую строку запроса module from node.js, но из-за того, что у меня есть объект в моем объекте фильтра, мои URL и action.payload выглядят следующим образом:

/trainers?filter=%5Bobject%20Object%5D&page=1

payload:
  filter: "[object Object]"
  page: "1"
  sortField: undefined
  sortOrder: undefined

Как я могу использоватьМодуль querystring, чтобы заставить его работать на вложенном объекте, или как это сделать без использования модуля?

1 Ответ

0 голосов
/ 28 февраля 2019

Попробуйте использовать URLSearchParams класс:

filterSearchResults = (values: any) => {
    let obj: any = {};
    Object.keys(values).forEach(
      key => values[key].length && (obj[key] = values[key])
    );
    return new URLSearchParams(obj).toString();
  };
...