У меня есть "Ответ":
Но я не могу его 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
Я бы предпочел добиться успеха, если я выключу сервер, журнал ошибок будет работать нормально. Я хочу получить ответ.
Конечно, не могли бы вы записать ответ перед if и опубликовать его содержимое в редактировать вашего сообщения? Не как изображение, а как текст, пожалуйста
Вы должны подписаться на наблюдаемые this._http.post(apiURL, idList, { observe: 'response' }, ).subscribe((res) => console.info(res));
@ mxr7350 ошибка, которую я получаю, привела меня к следующему: stackoverflow.com/questions/37280274/…, по-видимому, я console.infoging что-то, что сначала нужно проанализировать. Конечный результат Я действительно хочу загрузить результат в виде файла .csv Excel, поэтому, возможно, шаг регистрации, чтобы увидеть, что у меня есть результат, требует дополнительной работы. но я не могу использовать то, что они предлагают, и xhr, и jqxhr не распознаются моей IDE.
проблема в том, что получить ответ от POST просто невозможно?





используйте .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 может занять время. Но перед этим вы возвращаете объект результатов. Это причина того, что вы не получаете эти данные.
Он не использует обещания, он использует наблюдаемые
Я готов использовать любой из них, если он работает, но я предпочитаю наблюдаемые.
После полутора дней работы вот что сработало для меня:
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' - важный фактор, заставляющий его работать.
Вы хотите зарегистрировать ошибку или успех?