【问题标题】:Getting null response from post request though request processed successfully尽管请求处理成功,但从发布请求中获得空响应
【发布时间】:2020-01-27 12:07:00
【问题描述】:

我正在使用httpClient 发送post 请求,但通过请求处理成功获得null 响应。

serviceClass.ts文件

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)
}

当我在 Component 中调用上述方法时,我收到了来自 API 的 null 响应。

组件代码

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

这里op 完全无法理解,它显示_scaler=false 等。我怎样才能获得服务调用的正确状态?

编辑 1:当我向邮递员提出相同的请求时,获得状态 Ok 200

编辑 2: 下面的代码也给出了null 结果(根据@Spart_Fountain 的回答)

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

邮递员头部截图

【问题讨论】:

  • 你怎么知道它成功了?你在哪里查的?
  • bcz 记录存储在数据库中..
  • 好的,那么服务器配置回送什么?服务器可能没有被编程为向发出 HTTP 请求的客户端发送任何内容。
  • 我想要像“Ok”这样的 http 状态。我想向用户显示味精 成功创建 但没有状态我不能这样做。配置服务器不在我手中。当我从 .Net 应用程序调用相同的服务时,得到 http 响应“Ok”。
  • 尝试通过类似邮递员的方式发出相同的请求,看看会有什么响应。此外,在subscribe 中使用console.log("resp from api service: ", resp); 而不是添加+。这会强制调用对象的 toString() 方法(这是次要的,可能不是问题)。

标签: angular typescript httprequest


【解决方案1】:

调用this.objService.reprocess(this.reprobj); 时收到“奇怪”响应的原因是此方法将返回一个Subscription 对象。

详细说明:reprocess 方法返回对 observable 的订阅,因为 subscribe() 方法是在 return 语句本身内部调用的。你宁愿做的是只返回 observable 并在 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);
});

【讨论】:

  • 如果我在这里使用subscribe 得到错误node_modules/rxjs/internal/Subscription.d.ts:39:5 unsubscribe(): void; ~~~~~~~~~~~ 'unsubscribe' is declared here.
  • error TS2551: Property 'subscribe' does not exist on type 'Subscription'. Did you mean 'unsubscribe'?
  • @ArvindChourasiya 你只能订阅 Observable,不能订阅 Subscription 对象(另见this post)。换句话说:不要双重订阅!该服务应始终返回一个无需订阅的 Observable。
【解决方案2】:

您发布的代码 sn-p 看起来也很好,并且您已经检查了后端 API 工作正常,并且当您使用邮递员调用 API 时,您的数据库正在更新。

  1. 当您使用上述方法访问 API 时,您的数据库是否正在更新?
    如果不是,那么前端就有问题。检查您是否将正确的参数传递给 post 方法。

  2. 如果您在使用上述方法时数据库正在更新但没有得到响应。那么您的 API 可能不会发送任何响应。您可能想查看您的 API 代码。

【讨论】:

    【解决方案3】:

    实际上,您在日志中获得的空值是http客户端的正常行为。默认情况下,它只观察一个响应体。所以这意味着你已经得到了 200 OK 状态和一个空的身体作为响应。要观察整个响应,您可以执行 hext:

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

    【讨论】:

      【解决方案4】:

      试试这个:

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

      上面的将订阅方法重新处理。在再处理方法中: 进口声明:

      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。

      【讨论】:

        【解决方案5】:

        您确实需要订阅 Reprocess 功能。

        还添加一个错误回调函数,您可以在其中订阅记录从您的帖子尝试返回的任何错误。

        同时为您的浏览器运行开发者工具并检查网络选项卡以查看从您的 Angular 应用发出请求时发送的请求/响应和标头。

        在您的“网络”选项卡响应标头中查找以下内容:

        • 访问控制允许凭据:true
        • 访问控制允许来源: (您的网址,例如 localhost:4200)

        验证您的请求是否允许来自您的来源。

        还要检查“WWW-Authenticate:”是否显示错误,例如令牌无效。

        调用以从您的组件订阅服务重新处理功能,例如:

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

        您还可以修改服务函数以显式显示返回的内容(可订阅的 Observable):

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

        确保将 Observable 导入到您的服务中:

        import { Observable } from 'rxjs/Observable';
        

        由于它是由 Postman 工作的,并且您确信凭据是正确的,因此请关注我展示的代码更改,特别是确保导入 Observable,然后使用 subscribe 调用该函数。如果您在没有导入的情况下添加 Observable 返回类型,您将在代码中将其高亮显示为错误。

        【讨论】:

          【解决方案6】:
           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);
           });
          

          【讨论】:

            猜你喜欢
            • 2017-07-29
            • 2020-02-08
            • 1970-01-01
            • 2023-03-14
            • 1970-01-01
            • 2017-10-31
            • 1970-01-01
            • 2020-04-20
            • 1970-01-01
            相关资源
            最近更新 更多