标签: api-design

数据处理和转换应该在哪里进行?

我使用它Angular 4作为我的前端框架,基本上只是asp net core作为客户端获取数据并偶尔发布数据的 API。

我正在制作一个仪表板来显示一些统计数据。我在数据库中拥有的数据不能直接用于此仪表板,因为它需要转换和进一步处理。我不会将模型实体返回给 API,而是将其View Model与删除了一些 id 等的模型实体基本相同。

我现在所拥有的是,我的 AngularDashboardComponent正在使用 aDataService来构造一个HTTP GET指向我已经存在的 API 端点的请求GetOrders。这将从数据库中获取所有订单并将其返回到DataService最终DashboardComponent,然后需要提取数据并进行大量处理和转换,以便准备好提供数据Google Charts并生成有意义的图表。然后,用户可以选择在仪表板上查看另一个图表,仅拥有该图表是不够的Orders,还必须从数据库中检索另一个实体,因此使用不同的端点重复上述 API 调用。

我的问题归结为:

  • 最好是在服务器端完成所有处理和转换并将几乎准备好呈现的数据返回给客户端,还是可以让客户端来完成此任务?
  • 在服务器端处理和转换的情况下,我是否应该以这样的方式构建它:我的 API 端点与我想要在仪表板中显示的数据类型相对应?那么,例如选择“英国过去 3 个月的订单”会向专门采用国家/地区和时期等参数的 API 端点发送请求吗?
  • 也许数据应该已经是我可以通过某种数据仓库用于仪表板的形状了?这是要走的路吗?

一般来说,我正在寻找一些关于此的设计模式或只是最佳实践,但还没有真正找到一些东西。

design-patterns api-design transformation server-side client-side

2
推荐指数
1
解决办法
1713
查看次数

通过 server.expose 或 server.method 公开 hapi 插件方法

我们使用 Hapi 作为 API 框架,并将与持久存储后端(mongo 通过 mongoose)相关的所有内容放在插件中。现在我想知道如何最好地将不同集合(用户、通知、购买等)的所有 CRUD 方法公开给我们的其他 API 插件。

我知道server.expose并且server.method(这只是server.expose缓存吗?)并且只是无法决定在这种情况下我应该选择哪个。你能推荐一下吗?

非常感激!

javascript api-design node.js hapi.js

2
推荐指数
1
解决办法
716
查看次数

为什么PHP函数in_array和strpos中haystack和needle的顺序不一致?

haystack这两个非常核心的 PHP 函数中的参数顺序needle并不一致:

为什么会这样呢?

php api-design language-design

2
推荐指数
1
解决办法
1396
查看次数

将方法提取到通用基类中是一项重大更改

我有一个当前结构为这样的库:

class Base<T> 
{
}

class Derived : Base<int>
{
    public int Foo();
}

class AnotherDerived : Base<string>
{
}

Run Code Online (Sandbox Code Playgroud)

我想类似的添加Foo(),以AnotherDerived和为实现将是相同的两个,我想拉起Foo()到他们共享的父类Base像下面。

class Base<T> 
{
    public T Foo();
}

class Derived : Base<int>
{
}

class AnotherDerived : Base<string>
{
}
Run Code Online (Sandbox Code Playgroud)

否则会改变返回类型Foo()intT。更改成员的返回类型被列为重大更改。但是既然Derived是泛型的Base<T>T=int代码还是可以编译的,至少对于这个例子是这样。

int foo = myDerived.Foo();
Run Code Online (Sandbox Code Playgroud)

我不想向我的用户介绍重大更改,所以我的问题是这种拉起是否以任何方式被视为重大更改?进入基地本身不应该是一个突破性的变化

将方法移到其被移除类型的层次结构树中更高的类上

启用代码共享并且不应该是破坏性更改的替代实现,但如果上拉是非破坏性的,我想避免这种实现,可能是:

class Base<T> 
{
    protected T Foo();
}

class Derived …
Run Code Online (Sandbox Code Playgroud)

c# api-design

2
推荐指数
1
解决办法
360
查看次数

有人可以总结Java接口的可见性选择吗?

我真的有两个问题:

1)什么时候使用包私有接口?

2)有没有办法让一个公共接口关闭以便在其包外实现?

java oop api-design

1
推荐指数
1
解决办法
196
查看次数

内部和私人api保护

我在大约12岁的开发团队工作,我们构建了一套合理的API,我们仅在内部严格使用.通常,所有类和接口都是公共的,因为这就是它们的完成方式.我经常考虑将一些构造函数设置为内部的价值,以便API的消费者(尽管是内部的)必须使用工厂或我现在想不到的其他一些原因.

这是你和你的团队练习的东西吗?

这对您的单元测试有何影响?你是否发现通过它的工厂对一个类进行单元测试是可以的,还是通过像PrivateObject这样的东西来访问构造函数?

c# api-design protected internal

1
推荐指数
1
解决办法
501
查看次数

在命名空间声明后声明使用语句

我正在编写一个实用程序库,它由几个"包"组成.每个包中的类都包含在各种名称空间中.我已经知道如何通过在类声明结束时自动声明使用语句来简化情况(见下文),这将避免程序员在cpp文件中执行此操作.

namespace Utility
{
    class String
    {
        // Class Implementation
    };
}

using Utility::String;
Run Code Online (Sandbox Code Playgroud)

我的理解是,如果用户包含头String.h并且String在Utility中,那么程序员将希望使用String.显然,如果有外部类链包括一堆污染命名空间的文件,那么这可能会很糟糕,所以我想到如何将它变成#define.

namespace Utility
{
    class String
    {
        // Class Implementation
    };
}

#ifdef AUTO_DECLARE_NAMESPACE
    using Utility::String;
#endif
Run Code Online (Sandbox Code Playgroud)

这样,想要这种扩展功能的程序员可以获得它.

这是一个好主意还是有什么我忽略的?

c++ api api-design namespaces using-declaration

1
推荐指数
1
解决办法
194
查看次数

我可以在Haskell中约束类型/数据构造函数的参数化多态类型吗?

我有一个参数化类型,我想约束到一个数字类型,更具体地说是一个Fractional,例如:

data Rating a = (Fractional a) => Score a | Unscored deriving (Show, Eq)
Run Code Online (Sandbox Code Playgroud)

这样API的用户可以定义他们可能使用哪种非整数类型(FloatDouble?),但我写的内部API代码仍然可以对数字类型执行算术运算.我不希望它是一个整数,因为我的"内部操作"的结果可能不是整数,我的理解是使用Fractional会导致更准确的结果.

编译上面(至少在GHCI中)给出了以下错误:

    Data constructor `Score' has existential type variables, a context, or a specialised result type
  Score :: forall a. Fractional a => a -> Rating a
  (Use ExistentialQuantification or GADTs to allow this)
In the definition of data constructor `Score'
In the data declaration for `Rating'
Run Code Online (Sandbox Code Playgroud)

这告诉我,我正在做一些我可能不想继续尝试的事情; 即我的设计是垃圾.

我想我试图在这个API中说出以下内容:"当你使用Rating类型时,它的参数必须是一个子类,Fractional所以我可以对它执行准确的算术".我怎么能实现这个目标?还是我离开了标记和/或过度工程?

haskell types api-design parametric-polymorphism

1
推荐指数
1
解决办法
207
查看次数

HATEOAS和链接/动作

我试图围绕如何(以及是否要)在我的api中实现HATEOAS进行研究。我喜欢这样一种概念:仅向客户提供在当前情况下适当的操作。但是我不确定我是否正确实现了这个想法。

假设我有一个资源类型订单,其状态可以更改,它可以具有不同的状态(处理中接受拒绝过期,成功)。然后,我应该创建以下json对象:

{
    ...
    "links": {
        "accept": "http://example.com/order/1/accept",
        "decline": "http://example.com/order/1/decline"
    }
}
Run Code Online (Sandbox Code Playgroud)

还是我在这里创建不必要的动作?如果以上正确,是否应通过PATCH或GET更改状态?如果是PATCH,一个人怎么会知道(打败了超媒体的目的)?

编辑:忘记添加订单ID

rest api-design hateoas hypermedia json-api

1
推荐指数
1
解决办法
1072
查看次数

为什么Microsoft Graph API在URI中使用$ ref?

我注意到,Microsoft Graph API经常$ref在URI中使用。

例如,可以使用以下HTTP请求将成员添加到Office 365组

POST /groups/{id}/members/$ref
Run Code Online (Sandbox Code Playgroud)

为什么$ref使用后缀?这是否提供任何价值或优势?在这种情况下,这是否有特殊含义?

api rest api-design microsoft-graph

1
推荐指数
1
解决办法
218
查看次数