Угловой метод HttpClient Get с телом - PullRequest
0 голосов
/ 13 января 2019

Я улучшаю существующий API, и требуется предоставить один метод get, который может принимать несколько критериев поиска и на основе этих критериев выполнять запрос.

Я использую Spring MVC. Подпись метода get:

@GetMapping("/subscribers")
public ResponseEntity<List<SubscriberDTO>> getAllSubscribers(Pageable pageable, @RequestBody List<SearchCriteria> lstSearchCriteria)

Реализация работает, как и ожидалось, протестировано на Почтальоне

Теперь я собирался в Angular для реализации внешнего интерфейса, и я не могу найти способ отправки тела с помощью метода Get HttpClient ...

Я застрял. Должен ли я отправить критерии поиска по заголовкам? Или есть лучший способ сделать это?

Ответы [ 3 ]

0 голосов
/ 13 января 2019

В сервисном методе вы можете использовать свой метод, как показано ниже, который принимает необязательные параметры для поискового запроса. И вы можете отправить свой параметр поиска через Наблюдать, как показано ниже.

getAllSubscribers(
    page?,
    itemsPerPage?,
    userParams?
  ): Observable<PaginatedResult<Subscribers[]>> {
    const paginatedResult: PaginatedResultSubscribers[]> = new PaginatedResult<
      Subscribers[]
    >();

    let params = new HttpParams();

    if (page != null && itemsPerPage != null) {
      params = params.append("pageNumber", page);
      params = params.append("pageSize", itemsPerPage);
    }

    if (userParams != null) {
      params = params.append("minAge", userParams.minAge);
      params = params.append("maxAge", userParams.maxAge);
        }

       return this.http
      .get<Subscribers[]>(this.baseUrl + "/subscribers", { observe: "response", params })
      .pipe(
        map(response => {
          paginatedResult.result = response.body;
          if (response.headers.get("Pagination") != null) {
            paginatedResult.pagination = JSON.parse(
              response.headers.get("Pagination")
            );
          }
          return paginatedResult;
        })
      );
  }

Основная идея - использование HttpParams.

0 голосов
/ 30 июля 2019

Чтобы сделать ответ Амира более общим, я сделал следующее, чтобы построить параметры для переданного элемента.

К моей общей службе данных я добавил этот вариант:

// Get data for passed parameters or item containing filters
public getByItem<T>(apiMethod: string, item?: T, apiParms?: HttpParams): Observable<T> {
    if (!apiParms) apiParms = new HttpParams();
    if (item) {
        const keys = Object.keys(item) as Array<keyof T>;
        for (let key of keys) {
            apiParms = apiParms.append(key.toString(), item[key].toString());
        }
    }
    // Call generic method of data service
    return this.get<T>(apiMethod, apiParms); // => return this.http.get<T>(environment.apiUrl + apiMethod, { headers: this.defaultHeaders
0 голосов
/ 13 января 2019

Насколько я могу судить, вы не можете использовать HttpClient для отправки тела. Вы можете использовать запрос хотя бы для того, чтобы он был идиоматическим. (Или вы можете попытаться заставить Допустим, у вас есть массив с вашими критериями:

const criteria = [ {a: 25}, {b: 23} ];
http.get(url + '/?criteria='+ encodeURIComponent( JSON.stringify(criteria)));

Отправка тела в запросе GET является нарушением некоторого стандарта RFC, и даже если это может сработать, вы обязательно вызовете некоторых тайных демонов.

...