Typescript HttpClient.post 从 json 格式的字符串返回错误请求

Posted

技术标签:

【中文标题】Typescript HttpClient.post 从 json 格式的字符串返回错误请求【英文标题】:Typescript HttpClient.post returning bad request from json formatted string 【发布时间】:2021-06-30 19:50:18 【问题描述】:

好的,我已经操作这个字符串好几个小时了!因此,非常感谢任何帮助

我正在尝试简单地拨打电话并生成密码。该 api 被设置为接收一个字符串 a 解析 json 格式的字符串本身。

private headers = new HttpHeaders( 'Content-Type': 'application/json' );

  constructor(http: HttpClient) 
    var url: string = 'https://eus-safeaccounts-test.azurewebsites.net/' + 'passwords/generate';
    var body: string = '"\"regex\":\"[a-zA-Z0-9]\",\"minLength\":8,\"maxLength\":12"';

    http.post<string>(url, body,  headers: this.headers ).subscribe(result => 
      this.signUpResponseStr = result["password"];
    , error => console.error(error));
  

此调用返回代码 400 错误请求。 (我认为是因为文本没有被视为 json?)

但是,如果我们设置body = '""';,那么我们会得到一个从 api 发回的密码,这没有问题。它在 API 端被视为一个空字符串,然后他们给我们一个密码。进一步探索我尝试设置body = '"abc"';,因为这是一个不遵循json格式的字符串。在这种情况下,我们不会收到错误的请求 400,但 api 会识别错误的 json 格式并返回 Invalid Json

我的问题:

我发送此请求的正文字符串应该是什么样的? API 是开放的,因此任何人都可以重现,API 代码不应该与 400 bad request 问题有任何关系,正如我们从我的探索中看到的那样,但代码在这里https://github.com/nickpavini/SafeAccountsAPI。

感谢您的帮助! :)

编辑:我也尝试过以JSON 类型发送,我也尝试过JSON.stringify(),但没有成功

【问题讨论】:

【参考方案1】:

可能正文不应该被双引号引起来,而应该看起来像...

var body: string = '"regex":"[a-zA-Z0-9]","minLength":8,"maxLength":12'

【讨论】:

也不是这样。那是我尝试的第一件事。添加双引号只是为了使它作为空字符串通过【参考方案2】:

找到了。该字符串有点难以理解,但希望这对其他人有帮助。

body = '"\\"regex\\":\\"[a-zA-Z0-9]\\",\\"minLength\\":8,\\"maxLength\\":12"'

在这种情况下,主体似乎包含一个字符串。 (服务器将收到的实际字符串)

在该字符串中,每当我们需要服务器查看不关闭字符串的" 时,我们必须传递一个实际的反斜杠\\,然后传递一个"。在这种情况下,我们不需要 3 个反斜杠,因为开头的单引号 ' 确保包含所有括号。

注意:如果您觉得奇怪,请使用相关 API 进行测试。我认为这与 api 实现有关。

【讨论】:

以上是关于Typescript HttpClient.post 从 json 格式的字符串返回错误请求的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript入门五:TypeScript的接口

TypeScript系列教程--初探TypeScript

TypeScript入门三:TypeScript函数类型

typescript使用 TypeScript 开发 Vue 组件

认识 TypeScript

Learining TypeScript TypeScript 简介