【问题标题】:"Pass through" controller action (gets and returns JSON) in .NET Core 3.1.NET Core 3.1 中的“通过”控制器操作(获取和返回 JSON)
【发布时间】:2020-06-18 23:51:27
【问题描述】:

以前可能有人这样做过,但我似乎无法正确地提出问题以找到结果。我想从视图进行 AJAX 调用,但我不能直接从 javascript 调用外部 API,因为有一个我无法公开的密钥。我的想法是从页面调用另一个控制器操作,该操作调用我想从中获取数据的实际外部 REST API,然后将其作为 JSON 传递。我看到很多通过 C# 获取 JSON 并对其进行反序列化的示例,但在获取 JSON 然后返回它并从视图中使用它的地方并不多。任何帮助表示赞赏。

public JsonResult GetStuff()
        {
            HttpClient client = new HttpClient();
            client.BaseAddress = new Uri(URL);

            client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));

            HttpResponseMessage response = client.GetAsync("Stuff/?Id=" + id).Result;

*code to take response and pass it on as a JSON that I can consume from Javascript 
        }

【问题讨论】:

  • 你想调用其他控制器的动作吗?在您的视图控制器中,您应该能够通过获取由 IoC 注入的控制器并调用它来调用其他控制器的方法(操作)。如果您让下游操作不返回 JSON 而是返回对象,那么您就不需要搞乱反序列化。
  • 其余 API 只是来自同一个 Web 应用程序的另一个控制器?还是外部 API?
  • 它是一个外部API
  • 所以你想要一个外部 API 的代理?
  • 我也有同样的情况,来寻找答案。关键是通过不受干扰的方式传递结果,所以我猜你先 response.Content.ReadAsStringAsync 然后 return Content 使用响应 ContentType?

标签: c# .net json api asp.net-core-3.1


【解决方案1】:

这是我推荐的。

    [HttpGet("myapi/{id}");
    public async Task MyApi(int id) {
      // Replace these lines as needed to make your API call properly.
      using HttpClient client = new() {
        BaseAddress = REMOTE_SERVER_BASE
      }
      // Make sure to properly encode url parameters if needed
      using HttpResponseMessage response = await client.GetAsync($"myapi/{id}");

      this.HttpContext.Response.StatusCode = (int)response.StatusCode;
      foreach (KeyValuePair<string, IEnumerable<string>> header in response.Headers) {
        this.HttpContext.Response.Headers[header.Key] = new StringValues(header.Value.ToArray());
      }

      await response.Content.CopyToAsync(this.HttpContext.Response.Body);
    }

这会将所有常见的响应字段(例如状态代码、标头和正文内容)复制到您的响应中。

此代码未经测试,因此您可能需要对其进行一些调整,但它应该足以让您入门。

【讨论】:

    猜你喜欢
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-19
    • 2021-04-28
    • 2018-04-09
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多