首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WebAPI中的自定义返回结果

WebAPI中的自定义返回结果
EN

Stack Overflow用户
提问于 2019-02-01 07:50:41
回答 3查看 390关注 0票数 0

我有一个相当琐碎的WebAPI,它从另一个Webservice返回一个结果。

代码语言:javascript
复制
    [HttpGet]
    public List<MyList> GetResults()
    {
        var result = Webservice.GetResults().ToList();

        return result; 
    }

上面的内容返回来自Webservice调用的所有值,并且具有相同的道具名称。

我的问题是,如何从WebService获取数据,用自己的数据扩展一些数据,更改一些道具名称,然后返回新的结果?而不使用Automapper或类似的组件?

代码语言:javascript
复制
    [HttpGet]
    public List<MyList> GetResults()
    {
            var result = Webservice.GetResults().ToList();

    foreach (res in results) {
        var newTitle = result.Title + " - my custom value";
        var newData = "01/01/2019";
        var newLink = GetCustomLink(result);
    }       

        return newValues; 
    } 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-01 08:25:33

可以使用Linq的创建自定义结果。

代码语言:javascript
复制
 var result = Webservice.GetResults().ToList();
 return result.Select( s => new MyList{
            newTitle = result.Title + " - my custom value",
            newData = "01/01/2019",
            newLink = GetCustomLink(result)
        });
票数 0
EN

Stack Overflow用户

发布于 2019-02-01 08:15:11

在许多应用程序/API中,您讨论的是一个常见的场景。

如果你是从工程学的角度来看待这个问题,那么我会这样做:

  • 创建一个反映来自外部API的数据的模型。我们叫它ApiSourceDataDto吧。
  • 您的API希望获取这些数据并以某种方式对其进行转换,并返回新的格式,让我们将其称为MyApiDataDto。
  • 创建一个额外的层,现在假设一个新的类库,您可以在其中添加一个从ApiSourceDataDto到ApiSourceDataDto的转换层。假设我们有一个名为TranslationLayer的类。

使用函数方法从控制器调用该类。

我的意思是,您的翻译层将不了解任何外部API,它只知道它将以特定的格式接收一些数据,它将转换它并返回结果,仅此而已。这使得测试变得非常容易,因为您可以任意注入数据,并测试发生的事情,而不必模拟任何事情。

就像这样:

代码语言:javascript
复制
[HttpGet]
    public List<MyApiDataDto> GetResults()
    {
        List<ApiSourceDataDto> externalApiResults = Webservice.GetResults().ToList();
        List<MyApiDataDto> myResults = new TranslationLayer().Translate(externalApiResults)
        return myResults; 
    }

在一个单独的类库中,假设您有如下内容:

代码语言:javascript
复制
public class TranslationLayer{
     public List<MyApiDataDto> Translate(List<ApiSourceDataDto> input)
     {
         //apply your business logic and transformations here.
         //return the transformed data.
     } 
}

现在您有了SOC (分离关注点),并且可以开始围绕您的翻译方法进行一些适当的测试。您的控制器很简单,没有太多的代码,这是应该的。你想要瘦而不是胖的控制器。

当然,这只是给你一个初步的想法。如果您有很多翻译方法,那么您需要以一种对您的应用程序有意义的方式进行分离。一定要保持独立和任何业务逻辑以外的控制器。

当然,您还会添加一些代码来处理外部API返回的错误。

票数 1
EN

Stack Overflow用户

发布于 2019-02-01 08:23:47

您还可以使用LINQ方法,例如:

代码语言:javascript
复制
[HttpGet]
    public List<MyList> GetResults()
    {
            var result = Webservice.GetResults().ToList();





    return results.Select(xx=> new MyList{ // ,-- HERE YOU CAN ALSO USE A GENERIC NEW
                  newTitle = result.Title + " - my custom value",
                  newData = "01/01/2019",
                  newLink = GetCustomLink(result)
              }).ToList()

    } 

..。然后..。如果这个映射是循环的..。您可以创建一个扩展方法来执行以下操作:

代码语言:javascript
复制
public static MyList ToMyCustomType(this YOURWSTYPE input){

return new MyList{
           newTitle = result.Title + " - my custom value",
           newData = "01/01/2019",
           newLink = GetCustomLink(result)
}
}

public static List<MyList> ToMyCustomType(this IEnumerable<YOURWSTYPE> input){
 return input.Select(xx=> xx.ToMyCustomType()).ToList();
}

..。然后你就可以像这样:

代码语言:javascript
复制
  [HttpGet]
    public List<MyList> GetResults()
    {
           return  Webservice.GetResults().ToList().ToMyCustomType();


    } 

希望它能帮你!!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54475102

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档