Запрос Angular 5 Http api получает ответ в инструментах chrome dev, но не возвращается

У меня есть "Ответ":

Запрос Angular 5 Http api получает ответ в инструментах chrome dev, но не возвращается

Но я не могу его console.info.

Обновление (15:00 22.03.2018, это новая версия):

в actions.component.ts:

 generatePOR(){
    this._api.exportToERP(this.selection).subscribe((res) => {
      console.info('heelo I am second phase');
      console.info(res);
    }, (error) => console.info(error), () => {});
  }

в api.ts:

generatePOR (idList): any {
  const apiURL = `${this.API_URL}/purchaseorders/generatePOR`;
  return this._http.post(apiURL, idList, { headers: new HttpHeaders().set('Content-Type', 'application/json') });
}

вот журнал консоли:

ro {headers: Ge, status: 200, statusText: "OK", url: "http://localhost:8080/purchaseorders/generatePOR", ok: false, …}error: {error: SyntaxError: Unexpected token P in JSON at position 0
    at JSON.parse (<anonymous>)
    at XMLHttp…, text: "PARTNER_RELATION_CUSTOMER_GROUPCODE;PARTNER_RELATI…95;2;NEW ORDER PUBLISHED;;;2017-10-289 08:00:00
↵"}headers: Ge {normalizedNames: Map(0), lazyUpdate: null, lazyInit: ƒ}message: "Http failure during parsing for http://localhost:8080/purchaseorders/generatePOR"name: "HttpErrorResponse"ok: falsestatus: 200statusText: "OK"url: "http://localhost:8080/purchaseorders/generatePOR"__proto__: eo

Обновление (16:31):

generatePOR (idList): any {
    const apiURL = `${this.API_URL}/purchaseorders/generatePOR`;
    this.PORresult = this._http.post(apiURL, idList, {
      observe: 'response',
      headers: new HttpHeaders({'Content-Type': 'application/json'}),
      responseType: 'text' as 'text'
    })
      .map((res, i) => {
        console.info('hi');
        console.info(res);
      });
    return this.PORresult;
  }

выход :

hi  
ao {headers: Ge, status: 200, statusText: "OK", url: "http://localhost:8080/purchaseorders/generatePOR", ok: true, …}body: "PARTNER_RELATION_CUSTOMER_GROUPCODE;PARTNER_RELATION_CUSTOMER_PLANTCODE;PO_UpdateVersion;PARTNER_RELATION_SUPPLIER_NOLOCAL;PO_PoNumber;PO_PosNumber;PO_RequestNumber;PARTNER_RELATION_SUPPLIER_NO;PO_CollabPrice;PO_CollabPromQty;PO_Status;PO_SupAckNumber;PO_CollabComment;PO_CollabPromDate
↵PARTNER_RELATION_CUSTOMER_GROUPCODE;PARTNER_RELATION_CUSTOMER_PLANTCODE;1;PARTNER_RELATION_SUPPLIER_NOLOCAL;4500634818;00070;0001;PARTNER_RELATION_SUPPLIER_NO;464.95;2;NEW ORDER PUBLISHED;;;2017-10-289 08:00:00
↵"headers: Ge {normalizedNames: Map(0), lazyUpdate: null, lazyInit: ƒ}ok: truestatus: 200statusText: "OK"type: 4url: "http://localhost:8080/purchaseorders/generatePOR"__proto__: eo

heelo I am second phase  undefined

Вы хотите зарегистрировать ошибку или успех?

user4676340 22.03.2018 11:25

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

tatsu 22.03.2018 11:28

Конечно, не могли бы вы записать ответ перед if и опубликовать его содержимое в редактировать вашего сообщения? Не как изображение, а как текст, пожалуйста

user4676340 22.03.2018 11:30

Вы должны подписаться на наблюдаемые this._http.post(apiURL, idList, { observe: 'response' }, ).subscribe((res) => console.info(res));

mxr7350 22.03.2018 11:45

@ mxr7350 ошибка, которую я получаю, привела меня к следующему: stackoverflow.com/questions/37280274/…, по-видимому, я console.infoging что-то, что сначала нужно проанализировать. Конечный результат Я действительно хочу загрузить результат в виде файла .csv Excel, поэтому, возможно, шаг регистрации, чтобы увидеть, что у меня есть результат, требует дополнительной работы. но я не могу использовать то, что они предлагают, и xhr, и jqxhr не распознаются моей IDE.

tatsu 22.03.2018 13:33

проблема в том, что получить ответ от POST просто невозможно?

tatsu 22.03.2018 14:49
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
6
2 175
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

используйте .body, чтобы получить текст вашего ответа

if (res) {
      if (res.status === 201) {
        return [{ status: res.status, json: res.body }]
      }
      else if (res.status === 200) {
        console.info('hello, I am a result ',res);
        return [{ status: res.status, json: res.body }]
      }
    }

То, как вы возвращаете обещание, здесь неверно.

generatePOR (idList): Observable<any> {
const apiURL = `${this.API_URL}/purchaseorders/generatePOR`;
return this._http.post(apiURL, idList, { observe: 'response' }, )
  .map((res: HttpResponse<any>, i) => {
    if (res) {
      if (res.status === 201) {
        return [{ status: res.status, json: res }]
      }
      else if (res.status === 200) {
        console.info('hello, I am a result ',res);
        return [{ status: res.status, json: res }]
      }
    }
  })
  .catch((error: any) => {
    if (error.status < 400 ||  error.status ===500) {
      return Observable.throw(new Error(error.status));
    }
  })
  .pipe(
    catchError(this.handleError)
  );

}

не возвращайте this.results, верните обещание напрямую. Потому что api может занять время. Но перед этим вы возвращаете объект результатов. Это причина того, что вы не получаете эти данные.

Он не использует обещания, он использует наблюдаемые

mxr7350 22.03.2018 11:44

Я готов использовать любой из них, если он работает, но я предпочитаю наблюдаемые.

tatsu 22.03.2018 14:56
Ответ принят как подходящий

После полутора дней работы вот что сработало для меня:

actions.component.ts:

generatePOR(){
  this._api.generatePOR(this.selection).subscribe(res => {
    if (res !== null && res !== undefined){
      console.info(res.body);
    }
  }, (error) => console.info(error), () => {});
}

api.ts:

generatePOR(idList): any {
  const apiURL = `${this.API_URL}/purchaseorders/generatePOR`;
  this.PORresult = this._http.post(apiURL, idList, {
    observe: 'response',
    headers: new HttpHeaders({'Content-Type': 'application/json'}),
    responseType: 'text' as 'text'
  }).catch(this.handleError);
  return this.PORresult;
}

... и удостовериться, что серверная часть отправляет фактический файл в формате text/csv, а не просто перебор html.

этот поток github очень помог в создании правильного заголовка и параметров: https://github.com/angular/angular/issues/18586

примечание: вы должен делаете оба встроенными в вызов api, вы не можете заранее объявить их как переменные в функции или где-либо еще в классе или приложении. также бессмысленный синтаксический анализ: responseType: 'text' as 'text' - важный фактор, заставляющий его работать.

Другие вопросы по теме