为什么从未调用HttpClient的post方法?

时间:2019-06-15 22:22:24

标签: angular ionic4 angular-httpclient

我正在建立对本地API的http发布请求,以存储新的葡萄酒瓶。 get方法工作正常,但发布仅执行任何操作。我的要求缺少什么吗?为什么您认为post方法调用保持沉默?

我的研究没有帮助,我唯一能找到的类似问题是this one,但从未得到回答。像这样this.httpClient.post<WineBatch>指定类型没有帮助。

import { Storage } from '@ionic/storage'
import { WineBatch } from '../_models/WineBatch'
import { Injectable } from '@angular/core'
import { HttpClient } from '@angular/common/http'
import { ObservableResult } from '../_models/ObservableResult'

@Injectable()
export class WineBatchProvider {
  private storage: Storage
  private storageKey: string
  private apiUrl: string

  constructor(storage: Storage, private httpClient: HttpClient) {
    this.storage = storage
    this.storageKey = "batches"
    this.apiUrl = 'http://192.168.0.171:8080/api/qns/'
  }

  //#region API

  public refreshWineBatches() {
    this.httpClient.get(this.apiUrl + 'wines').subscribe(result => {
      let observableResult = new ObservableResult(result)
      this.setWineBatches(observableResult.data)
    })
  }

  public addWineBatch(data: any) {
    console.log("Sending data")
    this.httpClient.post(this.apiUrl + 'wines', { data: 'This should cause an error !' }).subscribe(res => {
      console.log("got response !")
    }, error => {
      console.error("error")
    })
    console.log("Data sent !")
  }
  //#endregion
}

此代码至少应引发一个错误。两个console.log都被调用,但是即使等待超时也不会出错。在服务器端,日志(记录所有API调用)中的任何跟踪都没有错误。确实感觉this.httpClient.post()完全出于某种原因而被忽略了。

修改

正如谢尔盖·梅尔(Sergey Mell)所问,这是“网络”标签中的screenshot(尚未允许在我的帖子中显示图片)。 xhr请求被立即取消,并且此错误会引起很多错误,不会引发任何异常。在这种情况下,该方法的调用方式并不是很真实,但是this question可能是正确的。

  

似乎angular忽略了中止事件。以下是Angular来源:https://github.com/angular/angular/blob/5.0.1/packages/common/http/src/xhr.ts   如果请求中止,返回的Observable不会通知订阅者。

但是现在我的问题是:为什么这个请求被取消了?

1 个答案:

答案 0 :(得分:0)

我认为是因为您可能没有在书面要求中发送任何内容:请尝试以这种方式更改代码:

public addWineBatch(data: any) {
console.log("Sending data")
this.httpClient.post(this.apiUrl + 'wines', data, { observe: 'response' })).subscribe(res => {
  console.log("got response !")
}, error => {
  console.error("error")
})
console.log("Data sent !")
}