【问题标题】:Designing a RESTful API设计一个 RESTful API
【发布时间】:2015-01-02 16:49:05
【问题描述】:

我正在设计一个 REST API 作为启动的 android 应用程序的后端服务。这家初创公司目前拥有其服务的网络版本,拥有大约 1 万名用户。我对 Web API 的设计有几个疑问:

  1. 如何确保我的 API 安全?

我希望只有 Android 客户端可以访问 API,其他任何人都不需要。一种方法是从前端发送加密令牌并在后端解密。还有其他方法吗?另外,我应该如何实现它?

  1. 如何让我的 API 快速高效?

有一个非常频繁访问的特定端点。但是,该端点上的信息并没有太大变化。因此,在短时间内发出的请求最有可能返回相同的响应。如何更快地响应此类请求? ETagLast-Modified 会完成这项工作吗?

  1. 我应该信任来自客户的数据吗?

目前,当我收到带有某些参数的请求时,我对请求执行的唯一检查是检查参数是否为null。例如。如果请求有 mobile 作为参数,我只检查请求中是否存在 mobile 参数。我不执行其他检查,例如检查 mobile 的长度是否小于 10 然后抛出异常。

编辑: 任何认为该问题“过于宽泛”的人,请发表评论,以便我可以编辑问题并添加任何必要的详细信息。

【问题讨论】:

  • 这个问题很广泛,但这里有一些反馈。 1.“安全”可以mean many things。考虑您正在保护哪些资源,以及如何访问它们。对于您提到的特定任务,也许尝试通过 HTTPS 建立会话并传递令牌,但这本身就是一个完整的问题。 2. 可能有一些因素会影响 API 请求的延迟。尝试使用分析工具来确定花费最多的时间。缓存是一个不错的选择,但请考虑它在哪里完成(数据库?,会话?,应用程序?)。 3. 不,从来没有。
  • @pieman72 1. 所谓安全,我的意思是只有 android 客户端可以访问 API。我认为令牌可以正常工作。 2. 你能推荐一个好的分析工具来衡量 API 性能吗? 3. 是的,我不应该相信来自客户的数据并实施所有必要的检查。
  • 您需要不同的工具,具体取决于您的应用程序堆栈,但看起来您使用的是 Django,所以可能是这样:https://code.djangoproject.com/wiki/ProfilingDjango

标签: django api rest http header


【解决方案1】:

我正在创办一家初创公司,我有几乎相同的问题需要解决。我认为唯一的区别在于第一个问题,因为我决定将 API 访问权限仅限于经过身份验证的用户。但是,这是我解决问题的方法:

1.如何确保我的 API 安全?

正如我所写,我将 API 访问权限仅限于经过身份验证的用户。我正在使用基于令牌的身份验证和我自己的基于以下包的 REST 注册/身份验证 API 端点:

如果你想使用这个解决方案,我建议你也看看django-rest-auth

2。如何让我的 API 快速高效?

如果你有“在短时间内发出的请求并且最有可能返回相同的响应”,我建议你缓存这个响应,像这样(最简单的版本):

if response_in_cache and time_passed < max_time_frame:
    return response_in_cache
else:
    generate response
    save response in the cache (for next time)
    return response

您还可以使用 New Relic 跟踪您的 api 性能。

3.我应该信任来自客户的数据吗?

绝对不是!尝试将django-rest-framework 用于您的 RESTful API。它提供了一个名为 Serializer 的类,它为您提供了一种控制请求/响应的输入/输出的强大方法。举个例子:

您的序列化程序

class CommentSerializer(serializers.Serializer):
    email = serializers.EmailField()
    content = serializers.CharField(max_length=200)
    created = serializers.DateTimeField()

验证

serializer = CommentSerializer(data={'email': 'foobar', 'content': 'baz'})
serializer.is_valid()
# False
serializer.errors
# {'email': [u'Enter a valid e-mail address.'], 'created': [u'This field is required.']}

看看serializer documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 2013-09-30
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多