草庐IT

php - 构建自定义API——需要逻辑检查

coder 2024-04-29 原文

我正处于为大型应用程序编写我的第一个完整 API 的计划和早期编码阶段。这些年来我使用了多个 API,但这是我第一次被要求构建允许在这个级别上进行编程交互的东西。

我已经进行了大量研究以寻找最佳实践等,并确定了我认为将提供相当灵活的响应通信系统的内容。

我的问题是:

这是您希望看到的 API 交互吗?

我错过了什么重要的事情吗?

API说明:

我将使用 HTTP Type 1 协议(protocol)进行通信,并使用唯一的 API key 进行身份验证。

我希望这是通过 SSL 连接上的 CURL 请求实现的。

成功 (200 OK) XML 响应示例(速率限制请求):

<?xml version="1.0" encoding="UTF-8"?>
<node>
    <short_message>Request Complete</short_message>
    <long_message>Rate Limit Status Response</long_message>
    <response_data>
        <rate_limit>40</rate_limit>
        <rate_used>31</rate_used>
    </response_data>
</node>

失败的 XML 响应示例(将在适当的 400/500 header 下发送);

<?xml version="1.0" encoding="UTF-8"?>
<node>
    <error_code>1201</error_code>
    <short_message>API Error</short_message>
    <long_message>The requested API version (1.5) is invalid</long_message> 
</node>

此外,我正在设置错误代码以用于可搜索的文档,以减轻其他开发人员的偏头痛。请求的通过/失败将通过适当的 HTTP 代码给出——成功 (200)、错误请求 (400)、未找到方法 (404)、身份验证失败 (403) 等...

我还使用基于版本的端点,这样任何代码更改都不需要外部代码更改。

最终,开发人员将能够请求 XML、JSON 或 PHP 序列化数组中的所有响应。

我的代码内部非常简单。所有数据都通过 POST(可能使用 CURL 或其他替代方法)传递,包括唯一的 API key 。该 API key 链接到系统中的用户,然后允许内部方法执行为该特定用户启用的一组有限功能。

我遵循 API 的“黄金法则”——“始终添加,永不删除”。

那么..我还应该考虑什么以及我错过了什么?

最佳答案

肖恩,

我假设您的目标是构建 RESTful API - 是这样吗?

我的回答只有在这个假设成立时才适用——我并不是要批评您的设计,而只是批评它的 RESTfulness。

REST 定义了 4 个接口(interface)约束,您的设计必须遵守这些约束才能成为 RESTful。您的设计至少违反了其中三个,因此不是 RESTful。这本身不一定是坏事,但重要的是您要了解您的系统可能不会具有您期望的属性。

我会尝试通过下面的简短回答让您入门,但请查看 http://nordsc.com/ext/classification_of_http_based_apis.html我在这里更多地讨论这个问题。然后,您可以将所有这些分解为更小的问题,然后返回此处或访问 Yahoo 组上的休息讨论:http://tech.groups.yahoo.com/group/rest-discuss/

现在对您的设计进行简短评论:

  1. 您不应使用自己的响应代码,而应仅使用 HTTP 提供的响应代码。您可以自行编写,但这些必须普遍适用,而不是特定于您的应用程序或交互。

  2. 您应该使用特定的媒体类型,而不仅仅是 application/xml。如果现有类型都不符合您的需要(或可以扩展以满足您的需要),您可以开发自己的类型。事实上,主要的设计事件应该花在媒体类型上。这是您的领域语义所在。

  3. 您必须遵守超媒体约束才能成为真正的 RESTful。这意味着应向客户提供链接和/或表格,以发现下一步可以做什么。

使用上面引用的分类,你的 API 看起来像一个基于 HTTP 的类型 I ( http://nordsc.com/ext/classification_of_http_based_apis.html#http-type-one ) 假设你没有在你的 URI 中放置操作,这将使其成为 RPC URI -隧道 ( http://nordsc.com/ext/classification_of_http_based_apis.html#uri-rpc )

我希望这能帮助您实现总体目标。

一月

关于php - 构建自定义API——需要逻辑检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2337817/

有关php - 构建自定义API——需要逻辑检查的更多相关文章

  1. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  2. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  3. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  4. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  5. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  6. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  7. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  8. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

  9. ruby - 检查方法参数的类型 - 2

    我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)

  10. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

随机推荐