Получение нулевого ответа от почтового запроса, хотя запрос успешно обработан - PullRequest
4 голосов
/ 27 января 2020

Я выполняю запрос post, используя httpClient, но получаю null ответ при успешной обработке запроса.

serviceClass.ts file

this.httpOptions = {
  headers: new HttpHeaders(
    { 
      'Content-Type': 'application/json; charset=utf-8',
      'tenant-code' : 'VdoFWiHL8RFR8fRGNjfZI=',
      'Authorization': 'Basic ' + btoa('pass:username')
    })
}

public Reprocess(ObjProduct) {
var Jobj=JSON.stringify(ObjProduct);
return this._http.post(this.ReprocessUrl,Jobj,this.httpOptions)
}

Когда я звоню При использовании вышеуказанного метода в компоненте я получаю null ответ от API.

Код компонента

var op = this.objService.reprocess(this.reprobj);
console.log("output: ", op);

Здесь op совершенно непонятен, он показывает _scaler=false et c. Как я могу получить правильный статус вызова службы?

Редактировать 1: Когда я делаю тот же запрос от почтальона, получая статус Ok 200.

Редактировать 2 : Ниже код также дает null результат (согласно ответу @ Spart_Fountain)

var op= this.restApi.Reprocess(this.reprobj).subscribe((data:any) => {
console.log("data "+ data);    
});

Скриншот заголовка почтальона

enter image description here

Ответы [ 6 ]

6 голосов
/ 27 января 2020

Причина, по которой вы получаете «странно выглядящий» ответ при вызове this.objService.reprocess(this.reprobj);, заключается в том, что этот метод вернет объект Subscription .

Подробно: метод reprocess возвращает подписка на наблюдаемое, потому что метод subscribe() вызывается внутри самого оператора return. Вы бы предпочли вернуть только наблюдаемое и подписаться на него вне метода reprocess:

public reprocess(objProduct) {
  var objParam = JSON.stringify(objProduct);
  return this._http.post(this.url, objParam, this.httpOptions);
}

var op = this.objService.reprocess(this.reprobj).subscribe(resp => {
  console.log("resp from api service: " + resp);
});
2 голосов
/ 04 февраля 2020

На самом деле, нулевое значение, которое вы получаете в журнале, является правильным поведением клиента http. По умолчанию это соблюдает только тело ответа. Это означает, что вы уже получили статус 200 OK и пустое тело в ответ. Для просмотра целого ответа вы можете сделать следующее:

   this.httpOptions = {
      headers: new HttpHeaders(
        { 
          'Content-Type': 'application/json; charset=utf-8',
          'tenant-code' : 'VdoFWiHL8RFR8fRGNjfZI=',
          'Authorization': 'Basic ' + btoa('pass:username')
        }),
        {
          observe: 'response'
        }
    }
2 голосов
/ 03 февраля 2020

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

  1. Обновляется ли ваша база данных при использовании вышеуказанного метода для доступа к API?
    Если нет, то во внешнем интерфейсе есть проблема. Проверьте, передаете ли вы правильные параметры методу post.

  2. Если ваша база данных обновляется, когда вы используете вышеуказанный метод, но не получаете ответ. Тогда, вероятно, ваш API не отправляет никакого ответа. Возможно, вы захотите взглянуть на свой код API.

0 голосов
/ 06 февраля 2020
 public reprocess(objProduct) {
 var objParam = JSON.stringify(objProduct);
 return this._http.post(this.url, objParam,this.httpOptions);
 }`var op = this.objService.reprocess(this.reprobj).subscribe(resp =>{
 console.log("resp from api service: " + resp);
 });
0 голосов
/ 05 февраля 2020

Вам необходимо подписаться на функцию Reprocess.

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

Также запустите инструменты разработчика для своего браузера. и откройте вкладку Сеть, чтобы увидеть запросы / ответы и заголовки, отправляемые при отправке запроса из вашего приложения Angular.

Найдите следующее в заголовках ответов вкладки Сеть:

  • Access-Control-Allow-Credentials: true
  • Access-Control-Allow-Origin: (Ваш URL, например localhost: 4200)

Чтобы убедиться, что ваш запрос разрешен для Ваше происхождение.

Также проверьте в случае ошибки, отображаемой для 'WWW-Authenticate:', например, неверный токен.

Выполните вызов для подписки вашего компонента на функцию повторной обработки службы, например:

this.objService.reprocess(this.reprobj).subscribe(result =>
{
console.log(result);
},
error => {
 console.log(error);
}
);

Вы также можете изменить сервисную функцию, чтобы явным образом отображать то, что возвращается (Наблюдаемый для подписки):

public reprocess(objProduct): Observable<any> {
  var objParam = JSON.stringify(objProduct);
  return this._http.post<any>(this.url, objParam, this.httpOptions);
}

Убедитесь, что Observable импортируется в ваш service:

import { Observable } from 'rxjs/Observable';

Поскольку он работает от Postman, и вы уверены, что учетные данные верны, сфокусируйтесь на изменениях кода, которые я показал, особенно убедитесь, что Observable импортируется, а затем вызывается функция с подпиской. Если вы добавите наблюдаемый тип возврата без импорта, вы увидите, что он выделен в вашем коде как ошибка.

0 голосов
/ 02 февраля 2020

Попробуйте:

this.objectService.reprocess(this.reprObj).subscribe(resp => {
   console.log(resp);
})

Вышеуказанный подпишется на повторную обработку метода. А в методе повторной обработки: оператор import:

import {HttpClient} from '@angular/common/http';
constructor(private http: HttpClient) { }

reprocess(objProduct) {
   const formData: FormData = new FormData();
   formData.append('object', objProduct)
   return(
     this.http.post(this.url, formData)
   )
}

На стороне сервера потяните objProduct.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...