Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在asp.net内核中使用web api响应传递HttpClient响应_C#_Rest_Asp.net Core - Fatal编程技术网

C# 如何在asp.net内核中使用web api响应传递HttpClient响应

C# 如何在asp.net内核中使用web api响应传递HttpClient响应,c#,rest,asp.net-core,C#,Rest,Asp.net Core,我有一个用asp.NETCore3.1编写的RESTAPI项目。在这个项目中,我有一些来自内部服务的简单数据和一些来自远程API的远程数据 远程API的响应类型是JSON,我不希望将响应强制转换为对象。我不希望API项目依赖于远程API对象结构类型,只获取数据并将数据作为JSON格式传递给API客户端 如何组合这些数据作为API的响应 public class VideoDto { public int Id { get; set; } public string Title {

我有一个用asp.NETCore3.1编写的RESTAPI项目。在这个项目中,我有一些来自内部服务的简单数据和一些来自远程API的远程数据

远程API的响应类型是JSON,我不希望将响应强制转换为对象。我不希望API项目依赖于远程API对象结构类型,只获取数据并将数据作为JSON格式传递给API客户端

如何组合这些数据作为API的响应

public class VideoDto
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
}
RESTAPI

private readonly IVideoQueryManager _videoQueryManager;

public async Task<ActionResult<object>> Get(int id)
{
    var videoDto = await _videoQueryManager.Get(id)

    using var client = new HttpClient();

    var response = await client.GetAsync($"http://example.com/videos/{id}/commments");

    string responseBody = await response.Content.ReadAsStringAsync();

    return new
    {
        videoDto = videoDto,
        comments = //How set responseBody here???
    };
}
private readonly IVideoQueryManager\u videoQueryManager;
公共异步任务Get(int-id)
{
var videoDto=await\u videoQueryManager.Get(id)
使用var client=new HttpClient();
var response=wait client.GetAsync($)http://example.com/videos/{id}/commments”);
string responseBody=wait response.Content.ReadAsStringAsync();
还新
{
videoDto=videoDto,
comments=//如何在此处设置ResponseBy???
};
}

取决于API返回的内容,不是吗

  • 如果是直字符串,则可以使用
    GetStringAsync
    ,从响应中获取直字符串
  • 如果是JSON对象,可以使用JSON解析器对其进行解码并提取正确的字段

作为旁注,您应该返回
IAsyncResult
,在现代ASP.NET MVC核心中,您的返回类型是旧的返回类型——特别要注意的是,
对象
是无用的,因为您根本没有专门定义返回类型。

取决于API返回的内容,不是吗

  • 如果是直字符串,则可以使用
    GetStringAsync
    ,从响应中获取直字符串
  • 如果是JSON对象,可以使用JSON解析器对其进行解码并提取正确的字段

作为旁注,您应该返回
IAsyncResult
在现代ASP.NET MVC核心中,您的返回类型是旧的返回类型——特别要注意的是,
对象
是无用的,因为您根本没有专门定义返回类型。

API是一个应用程序编程接口。换句话说,对象结构返回的函数与基于代码的接口一样。因此,您可以而且应该在客户机应用程序中有一个类来“实现”接口,为您提供数据绑定的对象

从API的角度来看,正如基于代码的接口在发布后不应更改一样,API返回的数据结构也不应更改。如果需要更改,则需要发布新版本,然后应向任何客户端发出弃用警告,并提示其更新代码以适应这些更改,然后这些更改才真正生效。然后,作为API的使用者,您只需更改类以匹配新版本


长话短说,只需创建一个类来表示数据并反序列化到该类中。这就是它的工作原理,这样做没有错

API是一种应用程序编程接口。换句话说,对象结构返回的函数与基于代码的接口一样。因此,您可以而且应该在客户机应用程序中有一个类来“实现”接口,为您提供数据绑定的对象

从API的角度来看,正如基于代码的接口在发布后不应更改一样,API返回的数据结构也不应更改。如果需要更改,则需要发布新版本,然后应向任何客户端发出弃用警告,并提示其更新代码以适应这些更改,然后这些更改才真正生效。然后,作为API的使用者,您只需更改类以匹配新版本


长话短说,只需创建一个类来表示数据并反序列化到该类中。这就是它的工作原理,这样做没有错

另外,由于您有两个独立的查询,因此您应该同时运行它们,而不是像代码中那样按顺序运行。感谢您的回答,我对我的问题进行了编辑,以澄清我的问题。如果您询问如何反序列化JSON字符串并从中提取数据,一种方法是在定义API返回的JSON响应的结构后使用
JsonConvert.DeserializeObject
。我不想反序列化到对象,因为响应是复杂类型,我不在此上下文中定义复杂类型,但您仍然需要从“复杂”格式提取数据,因此,您要么定义一个包含接收数据结构的类型,要么使用不带类型的表单返回
对象
,并将其强制转换为
动态
,或者您可以将其解析为
JToken
JArray
或任何您的数据,并通过提供的索引器进行访问。此外,由于您有两个独立的查询,您应该同时运行它们,而不是像在代码中那样按顺序运行。谢谢您的回答,我对我的问题进行了编辑以澄清我想要的是什么如果您询问如何反序列化JSON字符串并从中提取数据,一种方法是在定义API返回的JSON响应结构后使用
JsonConvert.DeserializeObject
。我不想反序列化到对象,因为响应是复杂类型,我没有在此上下文中定义复杂类型,但您仍然需要从“复杂”格式中提取数据,因此您可以定义包含接收数据结构的类型,或者使用不带类型的表单,该表单返回
对象
,并将其强制转换为
动态
,或者将其解析为
JToken
JArray
或任何数据,并通过提供的索引器访问。