Angular HttpClient在主体中使用JSON进行GET请求

时间:2019-03-15 16:10:54

标签: angular asp.net-web-api2

我正在使用Angular客户端应用程序和ASP.NET Core Web API后端,但是遇到一个问题,试图从Angular调用工作,而Postman似乎还可以。

打字稿代码:

 exportScript(commands: ScriptCommand[]) {
    this.http.post(this.baseUrl + 'api/ScriptCommands/GenerateScript', JSON.stringify(this.scriptCommands)).subscribe();
  }

C#API调用:

    [HttpGet]
    [Route("api/ScriptCommands/GenerateScript")]
    public IActionResult GenerateScript([FromBody]List<ScriptCommandViewModel> commands)
    {
        var mappedCommands = MapCommands(commands);
        var stream = ProcessCommands(mappedCommands);
        return File(stream, "application/xml", "generatedScript.xml");
    }

当我使用Angular调用时,我收到了400错误的请求,但是如果我将JSON字符串化的scriptCommand列表复制到Postman请求的正文中,就可以正常工作。

谢谢大家的帮助!

更新:更改了打字稿代码-我仍然收到HTTP 400错误的请求响应,但是我在Chrome浏览器中的“网络”标签在请求标头中显示了此内容-内容类型是否为“文本/纯文本”问题?

Accept: application/json, text/plain, */*
Content-Type: text/plain
Origin: http://localhost:4200
Referer: http://localhost:4200/createScript
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36

4 个答案:

答案 0 :(得分:0)

尝试在标题中测试内容类型

来自

'Content-Type': 'application/json'

'Content-Type': 'application/json;charset=utf-8'

答案 1 :(得分:0)

通过将其附加到请求 url 中来获取请求发送数据, 所以如果你有一个像 {"page":1,"search":"new products"} 这样的 json 正文。 要在获取请求中发送此数据,您可以使用以下代码。

SELECT
    game_id,
    category,
    generate_series(
        min(date_month),
        max(date_month),
        '1month'
        )::date AS date_month,
    0 as amount
FROM activity
WHERE NOT EXISTS (
    SELECT
        1
    FROM activity
    WHERE game_id=game_id AND category=category AND date_month=date_month
) 
GROUP BY 1,2
ORDER BY game_id, date_month

这将是创建请求 url 之类的(可以在控制台中的网络选项卡中验证)

get(path: string, params: any) {
    return this._http.get(this._baseUrl + path, { params: params })
      .pipe(timeout(CONST.API_TIMEOUT));
  }

答案 2 :(得分:-1)

我认为.append的工作方式与我们认为的有些不同。 Append返回附加的HttpParams。试试这个:

 exportScript(commands: ScriptCommand[]) {
    let httpParams = new HttpParams();
    httpParams  = httpParams.append("commands", JSON.stringify(this.scriptCommands));
    this.http.get(this.baseUrl + 'api/ScriptCommands/GenerateScript', { params: httpParams }).subscribe();
  }

答案 3 :(得分:-2)

好吧,我想你碰到了

get方法只是http.request('GET')的简写。 现在,如果您确实需要发送JSON正文,则必须使用另一种请求-例如post或put