以 RESTful 方式调用资源上的服务器端方法

2024-03-18

请记住,我对 REST 有初步的了解。假设我有这个网址:

http://api.animals.com/v1/dogs/1/

现在,我想让服务器让狗叫。只有服务器知道如何执行此操作。假设我想让它在 CRON 作业上运行,让狗在接下来的时间里每 10 分钟就吠叫一次。这个电话是什么样的?我有点想这样做:

网址请求:

ACTION http://api.animals.com/v1/dogs/1/

在请求正文中:

{"action":"bark"}

在你因为我编写自己的 HTTP 方法而对我生气之前,请帮助我并让我更好地了解应该如何以 RESTful 方式调用服务器端方法。 :)

编辑以澄清

关于“树皮”方法的作用的更多说明。以下是一些可能导致不同结构的 API 调用的选项:

  1. bark 只是向dog.email 发送了一封电子邮件,并且没有记录任何内容。
  2. bark 向dog.email 发送一封电子邮件,并将dog.barkCount 加1。
  3. bark 创建一个新的“bark”记录,并在 bark 发生时记录 bark.timestamp 记录。它还将dog.barkCount 增加1。
  4. bark 运行一个系统命令从 Github 上下载最新版本的狗代码。然后它会向dog.owner发送一条短信,告诉他们新的狗代码正在生产中。

为什么要追求 RESTful 设计?

RESTful 原则带来使网站变得简单的功能 (for a 随机人类用户来“冲浪”它们)Web 服务 API 设计,因此程序员很容易使用它们。REST 并不因为它是 REST 而好,而是因为它好所以好。 http://www.tbray.org/ongoing/When/200x/2009/03/20/Rest-Casuistry它很好主要是因为它是simple.

纯 HTTP 的简单性(没有 SOAP 信封和单 URI 重载)POST服务),什么有些人可能会打电话“缺乏特色”, 实际上是它最大的力量。 HTTP 立即要求您拥有可寻址性 and 无国籍:保持 HTTP 可扩展至当今大型站点(和大型服务)的两个基本设计决策。

但 REST 并不是灵丹妙药:有时是 RPC 风格(“远程过程调用”——例如 SOAP)可能合适,有时其他需求优先于网络的优点。这可以。我们真正不喜欢的是不必要的复杂性。很多时候,程序员或公司会引入 RPC 风格的服务来完成普通的旧 HTTP 可以很好处理的工作。其效果是,HTTP 被简化为用于解释“真正”发生的情况的巨大 XML 负载的传输协议(而不是 URI 或 HTTP 方法提供有关它的线索)。由此产生的服务过于复杂,无法调试,并且除非您的客户拥有精确设置正如开发商的意图。

与 Java/C# 代码相同not面向对象,仅使用 HTTP 并不能使设计成为 RESTful。一个人可能会陷入匆忙之中thinking关于他们的服务在操作和远程方法方面应该这样称呼。难怪这大部分最终都会出现在 RPC 风格的服务(或 REST-RPC 混合服务)中。第一步是以不同的方式思考。 RESTful 设计可以通过多种方式实现,其中一种方法是从资源而不是操作的角度考虑您的应用程序:

???? 不要考虑它可以执行的操作(“在地图上搜索地点”)......

...尝试从以下角度思考results这些操作的列表(“地图上符合搜索条件的地点列表”)。

我将在下面举一些例子。 (REST的另一个关键方面是HATEOAS的使用——这里就不刷了,不过我很快就讲一下在另一个帖子 https://stackoverflow.com/a/30607633/1850609.)


第一个设计的问题

让我们看一下建议的设计:

ACTION http://api.animals.com/v1/dogs/1/

首先,我们不应该考虑创建一个新的 HTTP 动词 (ACTION)。一般来说,这是不受欢迎的有几个原因:

  • (1)仅给定服务 URI,“随机”程序员如何知道ACTION动词存在吗?
  • (2)如果程序员知道它存在,他将如何知道它的语义?这个动词是什么意思?
  • (3)人们应该期望该动词具有什么属性(安全性、幂等性)?
  • (4)如果程序员有一个非常简单的客户端,仅处理标准 HTTP 动词怎么办?
  • (5) ...

现在让我们考虑使用POST(我将在下面讨论原因,现在就相信我的话):

POST /v1/dogs/1/ HTTP/1.1
Host: api.animals.com

{"action":"bark"}

This could没关系...但是only if:

  • {"action":"bark"}是一份文件;和
  • /v1/dogs/1/ was a "document processor" (factory-like) URI. A "document processor" is a URI that you'd just "throw things at" and "forget" about them - the processor may redirect you to a newly created resource after the "throwing". E.g. the URI for posting messages at a message broker service, which, after the posting would redirect you to a URI that shows the status of the message's processing.

我对你的系统了解不多,但我打赌这两者都不是真的:

  • {"action":"bark"} 不是一个文件,实际上是方法你正在尝试忍者潜行进入服务;和
  • the /v1/dogs/1/URI 代表“狗”资源(可能是带有id==1)而不是文档处理器。

所以我们现在所知道的是,上面的设计并不是那么 RESTful,但这到底是什么呢?这有什么不好呢?基本上,它很糟糕,因为这是具有复杂含义的复杂 URI。你无法从中推断出任何东西。程序员怎么知道狗有bark可以秘密注入的行动POST进去?


设计问题的 API 调用

因此,让我们切入正题,尝试通过思考来轻松地设计这些吠声在资源方面。请允许我引用宁静的网络服务 https://rads.stackoverflow.com/amzn/click/com/0596529260 book:

A POST请求是尝试从现有资源创建新资源 一。现有资源可能是新资源的父资源 数据结构意义上,树的根是所有树的父节点 它的叶节点。或者现有的资源可能是特殊的“工厂”资源,其唯一目的是生成其他资源。这 连同一份代表一起发送POST请求描述了初始 新资源的状态。与 PUT 一样,POST请求不需要 完全包括代表。

根据上面的描述我们可以看出bark可以建模为的子资源dog(因为bark包含在狗体内,即“吠叫”by a dog).

从这个推理我们已经得到:

  • 方法是POST
  • 资源是/barks,狗的子资源:/v1/dogs/1/barks,代表一个bark“工厂”。该 URI 对于每只狗来说都是唯一的(因为它位于/v1/dogs/{id}).

现在,列表中的每个案例都有特定的行为。

##1. bark 只是发送了一封电子邮件至dog.email并没有记录任何内容。

首先,吠叫(发送电子邮件)是同步任务还是异步任务?其次是bark请求需要任何文件(可能是电子邮件)还是空的?


1.1 bark 发送电子邮件至dog.email并且不记录任何内容(作为同步任务)

这个案例很简单。致电barks工厂资源立即发出声音(发送电子邮件),并立即给出响应(无论是否正常):

POST /v1/dogs/1/barks HTTP/1.1
Host: api.animals.com
Authorization: Basic mAUhhuE08u724bh249a2xaP=

(entity-body is empty - or, if you require a **document**, place it here)

200 OK

由于它没有记录(改变)任何内容,200 OK足够。这表明一切都按预期进行。


1.2 bark 发送电子邮件至dog.email并且不记录任何内容(作为异步任务)

在这种情况下,客户端必须有一种方法来跟踪bark任务。这bark那么任务应该是一个有自己 URI 的资源:

POST /v1/dogs/1/barks HTTP/1.1
Host: api.animals.com
Authorization: Basic mAUhhuE08u724bh249a2xaP=

{document body, if needed;
NOTE: when possible, the response SHOULD contain a short hypertext note with a hyperlink
to the newly created resource (bark) URI, the same returned in the Location header
(also notice that, for the 202 status code, the Location header meaning is not
standardized, thus the importance of a hipertext/hyperlink response)}

202 Accepted
Location: http://api.animals.com/v1/dogs/1/barks/a65h44

这样一来,每个bark是可追溯的。然后客户端可以发出GET to the bark用于了解当前状态的 URI。也许甚至可以使用DELETE取消它。


2. bark 发送电子邮件至dog.email然后递增dog.barkCount by 1

如果您想让客户知道,这可能会比较棘手dog资源发生变化:

POST /v1/dogs/1/barks HTTP/1.1
Host: api.animals.com
Authorization: Basic mAUhhuE08u724bh249a2xaP=

{document body, if needed; when possible, containing a hipertext/hyperlink with the address
in the Location header -- says the standard}

303 See Other
Location: http://api.animals.com/v1/dogs/1

在这种情况下,location标题的目的是让客户知道他应该看一下dog。来自HTTP RFC 关于303 https://www.rfc-editor.org/rfc/rfc2616#section-10.3.4:

该方法的存在主要是为了允许输出POST- 激活脚本将用户代理重定向到选定的资源。

如果任务是异步的,bark就像需要子资源一样1.2情况和303应返回GET .../barks/Y当任务完成时。


3.树皮创建一个新的“bark” 记录与bark.timestamp记录吠叫发生的时间。也随之递增dog.barkCount by 1.

POST /v1/dogs/1/barks HTTP/1.1
Host: api.animals.com
Authorization: Basic mAUhhuE08u724bh249a2xaP=

(document body, if needed)

201 Created
Location: http://api.animals.com/v1/dogs/1/barks/a65h44

在这里,bark是由于请求而创建的,因此状态201 Created被申请;被应用。

如果创建是异步的,202 Accepted是必须的 (正如 HTTP RFC 所说 https://www.rfc-editor.org/rfc/rfc2616#section-10.2.2) 反而。

保存的时间戳是的一部分bark资源并可以通过以下方式检索GET到它。更新后的狗可以被“记录”在其中GET dogs/X/barks/Y以及。


4. bark 运行系统命令从 Github 上下载最新版本的狗代码。然后它会发送一条短信至dog.owner告诉他们新的狗代码正在制作中。

这个的措辞很复杂,但它几乎是一个简单的异步任务:

POST /v1/dogs/1/barks HTTP/1.1
Host: api.animals.com
Authorization: Basic mAUhhuE08u724bh249a2xaP=

(document body, if needed)

202 Accepted
Location: http://api.animals.com/v1/dogs/1/barks/a65h44

然后客户端会发出GETs to /v1/dogs/1/barks/a65h44了解当前状态(如果代码被提取,则电子邮件已发送给所有者等)。每当狗发生变化时,303是适用的。


包起来

Quoting 罗伊·菲尔丁 http://roy.gbiv.com/untangled/2009/it-is-okay-to-use-post:

REST 对方法的唯一要求是它们是统一的 为所有资源定义(即,这样中介就不必 了解资源类型以便理解其含义 要求)。

在上面的例子中,POST是统一设计的。会让狗“bark“。这不安全(意味着树皮对资源有影响),也不是幂等的(每个请求都会产生一个新的bark),这符合POST动词 好。

程序员会知道:POST to barks产生一个bark。响应状态代码(必要时还包含实体主体和标头)负责解释更改的内容以及客户端可以和应该如何继续。

Note: The primary sources used were: "Restful Web Services https://rads.stackoverflow.com/amzn/click/com/0596529260" book, the HTTP RFC https://www.rfc-editor.org/rfc/rfc2616 and Roy Fielding's blog http://roy.gbiv.com/untangled.




Edit:

自最初创建以来,问题和答案已经发生了很大变化。这原问题询问 URI 的设计,例如:

ACTION http://api.animals.com/v1/dogs/1/?action=bark

以下是为什么它不是一个好的选择的解释:

客户端如何告诉服务器该怎么办数据是方法信息.

  • RESTful Web 服务在 HTTP 方法中传送方法信息。
  • 典型的 RPC 样式和 SOAP 服务将其保留在实体主体和 HTTP 标头中。

哪一部分[客户端希望服务器]操作的数据是范围信息.

  • RESTful 服务使用 URI。 SOAP/RPC 风格的服务再次使用实体主体和 HTTP 标头。

以 Google 的 URI 为例http://www.google.com/search?q=DOG。其中,方法信息是GET范围信息是/search?q=DOG.

长话短说:

  • In RESTful 架构,方法信息进入HTTP方法。
  • In 面向资源的架构,范围信息进入 URI。

经验法则:

如果 HTTP 方法与方法信息不匹配,则该服务不是 RESTful。如果范围信息不在 URI 中,则该服务不是面向资源的。

你可以把"bark" "action"在 URL(或实体主体)中并使用POST。没问题,它有效,而且可能是最简单的方法,但这并不宁静.

为了让您的服务真正保持 RESTful,您可能必须退一步思考您真正想在这里做什么(它将对资源产生什么影响)。

我无法谈论您的具体业务需求,但让我给您举一个例子:考虑一个 RESTful 订购服务,其中订单位于 URI 处,例如example.com/order/123.

现在假设我们想取消订单,我们该怎么做呢?人们可能会认为这是一个“消除” "action"并将其设计为POST example.com/order/123?do=cancel.

正如我们上面所说,这不是 RESTful。相反,我们可以PUT的新代表order with a canceled元素发送到true:

PUT /order/123 HTTP/1.1
Content-Type: application/xml

<order id="123">
    <customer id="89987">...</customer>
    <canceled>true</canceled>
    ...
</order>

And that's it. If the order can't be canceled, a specific status code can be returned. (A subresource design, like POST /order/123/canceled with the entity-body true may, for simplicity, also be available.)

In your specific scenario, you may try something similar. That way, while a dog is barking, for example, a GET at /v1/dogs/1/ could include that information (e.g. <barking>true</barking>). Or... if that's too complicated, loosen up your RESTful requirement and stick with POST.

Update:

我不想让答案太大,但是需要一段时间才能掌握公开算法的窍门(一个action)作为一组资源。而不是从行动的角度思考(“在地图上搜索地点”),需要考虑该行动的结果(“地图上与搜索匹配的地点列表 标准”).

如果您发现您的设计不符合 HTTP 的统一接口,您可能会发现自己又回到了这一步。

查询变量are 范围信息,但是做not表示新资源(/post?lang=en显然是same资源为/post?lang=jp,只是不同的表示)。相反,它们是用来传达客户状态 (like ?page=10,这样状态就不会保存在服务器中;?lang=en这里也是一个例子)或输入参数 to 算法资源 (/search?q=dogs, /dogs?code=1)。同样,不是不同的资源。

HTTP 动词(方法)属性:

另一个明确的点表明?action=somethingURI 中的非 RESTful 是 HTTP 动词的属性:

  • GET and HEAD是安全的(并且是幂等的);
  • PUT and DELETE仅幂等;
  • POST两者都不是。

Safety: A GET or HEAD请求是一个请求read一些数据,而不是更改任何服务器状态的请求。客户可以做一个GET or HEAD请求 10 次,与发出一次相同,或者从来没有成功过.

幂等性:一种幂等运算,无论应用一次还是多次,都具有相同的效果(在数学中,乘以零是幂等的)。如果你DELETE资源一次,再次删除效果相同(资源为GONE已经)。

POST is neither safe nor idempotent. Making two identical POST requests to a 'factory' resource will probably result in two subordinate resources containing the same information. With overloaded (method in URI or entity-body) POST, all bets are off.

这两个属性对于 HTTP 协议的成功非常重要(在不可靠的网络上!):您更新了多少次(GET)页面无需等到完全加载?

创建一个action将其放在 URL 中显然违反了 HTTP 方法的约定。再说一次,技术允许你,你可以做到,但这不是 RESTful 设计。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以 RESTful 方式调用资源上的服务器端方法 的相关文章

  • 在应用程序中注册API

    通过 django rest framework 我正在使用DefaultRouter 我想为多个应用程序提供 API 所以我的问题是我能否以 django 方式执行此操作 并将我的路由器注册放入每个应用程序 URLconf 中 并让它们显
  • 找不到可接受的代表

    我是 Spring Boot 的新手 我可能会犯一些愚蠢的错误 所以提前对此类问题表示歉意 我正在尝试编写接受以下 JSON 的 POST API id null a 1 3 b somestring mapJson monday 10 0
  • 如何在没有可用行选择器的情况下为 APEX 21.1 REST 数据源设置数据配置文件

    我正在使用 APEX 21 1 并为 Web 服务创建了一个 REST 数据源 该服务以以下格式返回响应 1499040000000 A time stamp 0 01634790 A value etc 1499040000100 A t
  • 如何使用放心获取 Rest API 中的授权令牌?是否可以?

    目前使用 Postman 我必须向 API URL login 发送请求 并传递用户名和密码 作为回报 我得到令牌 如下所示 请求示例 login POST Body username admin password admin Return
  • 在 Android 上解析查询字符串

    Java EE 有ServletRequest getParameterValues http java sun com j2ee sdk 1 3 techdocs api javax servlet ServletRequest html
  • 在 C# 控制台应用程序中使用 HttpClient 使用 WEB API

    我使用 MySQL 数据库在 Visual Studio 2015 中创建了一个 Web API API 运行完美 所以我决定做一个控制台client http www c sharpcorner com article web api w
  • 无法从角度路由器获取路径或 url

    我无法从 ActivatedRoute 或 Router 导入中获取 URL 或路径 它为路径 输出空白 为 URL 输出 我记得使用的是工作版本 唯一捕获正确路由的是Router events 我也无法订阅ActivatedRoute 中
  • Azure API Manager 将所有内容公开,摆脱 Ocp-Apim-Subscription-Key

    我有一些通过 Azure API 管理代理的 REST API 出于某种原因 我希望将其公开以应对所有请求 从开发人员的角度来看 我想摆脱在标头 或请求 中设置密钥 Ocp Apim Subscription Key XXXXXXXXXXX
  • 是否可以在带有 标记的链接上使用空 href

    我将基本标签设置为这样 然后我想创建一个链接http mnapoli github com PHP DI http mnapoli github com PHP DI 在相对路径中 I tried a href link a 它在 Chro
  • 在android中的webview中运行时更改URL

    我创建了一个小程序 可以在 webview 中加载特定网站 我想密切关注 URL 如果 URL 包含 xxx 单词 那么它应该导航到另一个页面 例如 如果我设置 www example com 我现在可以导航到 www example co
  • 使用 Post 以 REST 方式更新值

    我对 REST 很陌生 所以如果这是一个愚蠢的问题 请原谅我 这样 我就有了客户资源 一个客户有很多信用 所以 我想获取客户积分的 URL 是 客户 21 积分 其中 21 是客户 ID 现在 如果我没有全额积分 如何添加积分 例如 客户有
  • 当前用于验证 Http 请求(REST、Xml over Http)的标准是什么?

    该标准应解决以下身份验证挑战 例如 重放攻击 中间的人 明文攻击 字典攻击 暴力攻击 被假冒服务器欺骗 我已经研究过 Amazon Web Services 这是一种可能性 更重要的是 似乎有两种最常见的方法 使用 apiKey 它的编码方
  • Jersey 和 Spring 中的全局异常处理?

    我正在使用 Jersey 和 Spring 3 2 以及 Open CMIS 开发 RESTful Web 服务 我没有使用 Spring 的 MVC 模式 它只是 Spring IOC 和 Jersey SpringServlet 控制器
  • 以 RESTful 方式增加资源计数器:PUT 与 POST

    我有一个带有计数器的资源 为了举例 我们将该资源称为profile 计数器是数量views对于该配置文件 Per the 休息维基 http rest blueoxen net cgi bin wiki pl HttpMethods PUT
  • iPhone 应用程序中的异步、同步、线程

    我正处于一个应用程序的设计阶段 该应用程序将利用 REST Web 服务 并且在使用异步 同步和线程方面遇到了困境 这是场景 假设您有三个选项可供深入研究 每个选项都有自己的基于 REST 的资源 我可以使用同步请求延迟加载每个请求 但这会
  • Google 地图 API 标记图标 URL?

    我正在尝试将标记图标更改为 红圈 或 红针 或其他任何内容 在这些代码中 markerOptions icon images beachflag png 标记不显示 但如果我做icon一行注释行 因此标记显示为 red pin icon 所
  • REST Web 服务 WSDL? [复制]

    这个问题在这里已经有答案了 我正在实现一个 Web 服务 并且已经实现了 REST 和 SOAP 版本 看看哪个版本适合我的需求 我决定选择 REST 因为它很简单 而且我可能会开发一个 iPhone 应用程序来使用它 我的问题很简单 是否
  • AVAudioPlayer 无法从网站播放 m4a 或 mp3 文件类型

    我试图在我的应用程序中找到一个仅纯 m4a 声音的 URL 我有音频的 URL 理论上可以下载它 然后 使用下载的文件URL到声音 我尝试使用AVAudioPlayer播放它 但它不播放任何声音 这是我的代码 在 URL 检索函数中 我调用
  • Apache Camel 2.14 Rest DSL 安全

    我想使用 Apache Camel 2 14 中新的 Rest DSL 来创建一个 Rest 接口 我想使用 Jetty 组件 并且我有一个如下所示的基本示例设置 Spring安全配置
  • Java中使用正则表达式确定字符串是否为URL [重复]

    这个问题在这里已经有答案了 可能的重复 检查字符串是否为有效 URL 的最佳正则表达式是什么 https stackoverflow com questions 161738 what is the best regular express

随机推荐

  • 你怎么知道用 malloc() 分配多少空间?

    我是一个完全的 C 新手 我来自 C 我一直在学习内存管理和malloc 功能 我也遇到过这段代码 char a persons name malloc sizeof char 2 我不明白这是分配了多少空间a persons name 是
  • Excel更改条件格式公式

    我有一个表 其中包含许多代表时间线的单元格 每分钟一个单元格 宽度非常小 我想在该表中可视化包含三个阶段的操作 一条线上可以有多个手术 代表一个手术室 例如 如果准备工作在 10 00 开始 实际操作在 10 23 开始 则这些时间之间的所
  • 如何使用GVIM编辑远程文件?

    我在 Ubuntu 9 10 上使用 GVIM 我正在寻找正确的方法来配置 GVIM 以便能够通过 ftp 等方式编辑远程文件 HTML PHP CSS 当我使用 e scp username remotehost path to file
  • 将数据表导出到 Excel [重复]

    这个问题在这里已经有答案了 可能的重复 如何在C 中将DataTable导出到Excel https stackoverflow com questions 8207869 how to export datatable to excel
  • Mongoose 使用多个参数搜索 FindOne

    我第一次尝试使用 Angular Express mongodb 构建一些东西 所以我可能会以完全错误的方式进行处理 Express 用于提供 json 然后 Angular 会处理所有视图等 我正在使用 Mongoose 与 Mongo
  • Python运行系统命令然后退出...不会退出

    我有以下 python 代码 os system C Python27 python exe C GUI TestGUI py sys exit 0 它运行命令正常 并弹出一个窗口 但是 它不会退出第一个脚本 它就留在那里 我最终不得不强制
  • 如何使用带标签的 AWS Cli 过滤 Lambda?

    所以我知道我可以通过此命令以文本 csv 形式获取所有 lambda 函数 aws lambda list functions region us east 1 query Functions FunctionName output tex
  • 如何获取带视频 ID 的 YouTube 视频描述?

    我目前正在使用 youtube 的 Javascript API 在我的网页上显示视频 但是现在我还想从视频 ID 中检索 youtube 描述 我该怎么做呢 我只想要描述和标题 ex kind youtube video etag eta
  • 使用 Nom 5 解析带有转义引号的单引号字符串

    我是 Rust 和 Nom 的新手 我正在尝试解析可能包含转义引号的 单 引号字符串 例如 foo bar or x x or 我找到了escaped 宏 其文档 https docs rs nom 5 0 1 nom macro esca
  • LinkedList 为同一功能提供了多种方法 - 为什么? [复制]

    这个问题在这里已经有答案了 我正在检查Java util LinkedList类 发现Linked List类提供了几个方法 public void addFirst E e public boolean offerFirst E e pu
  • 通过单独的线程在表单上绘图

    我正在尝试构建一个多线程游戏 其中我有一个单独的线程用于在不是主线程的表单上进行绘画 这给我们带来了线程安全技术 我已经阅读了很多相关文章 但我不确定我是否正确理解了它 我的问题是我有一个结构 其中每个数据对象都在表单上自行绘制 所以我不知
  • 如何使用XHTML/HTML给网站添加站内搜索功能? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我真的很想学习如何为我的网站制作自己的搜索引擎 我有定义的按钮和标签 但它不搜索 我无法弄清楚用于实际搜索该网站的 HTML 或 XHTM
  • 杰克逊 FAIL_ON_UNKNOWN_PROPERTIES 为 false 不起作用

    我正在尝试使 jackason 的 thrift 反序列化向后兼容 ObjectMapper mapper getObjectMapper false pretty mapper configure DeserializationFeatu
  • 将opentok视频会议集成到parse.com + iOS应用程序中

    这个问题不仅针对代码 还针对我的应用程序设计 我有一个 iPhone 应用程序 需要 opentok 来处理视频 音频会话 我已经经历过基本样品 http www tokbox com opentok ios docs index html
  • 在 iOS 上禁用全屏自动播放

    我遇到的唯一问题是 根据苹果文档 我无法禁用全屏播放视频 这是默认启用的 需要设置如下 webView configuration allowsInlineMediaPlayback true 这是基于我的理解它应该是怎样的 然而 这不起作
  • 是否可以在 DOM 中移动

    我想创建一个
  • 在Scheme中编写一个自动记忆器。有关宏和包装器的帮助

    我在Scheme中编写自动记忆器时遇到了一些问题 我有一个有效的 memoize 函数 它创建一个哈希表并检查该值是否已经计算出来 如果之前已经计算过 则返回值 否则调用该函数 define memoizer fun let a table
  • 如何决定创建受检异常或非受检异常[重复]

    这个问题在这里已经有答案了 我想知道如何知道创建并抛出已检查异常或未检查异常 例如 我有一项服务 它会获取一些数据并在使用之前对其进行验证 在验证过程中 某个字段不符合规则 我想抛出一个异常 比如 ValidationException 我
  • gapi.client.load 与 google.load

    我对如何正确加载 Google 的 API 感到困惑 我看到提到了两种不同的方法 First 谷歌 API 加载器 https developers google com loader https developers google com
  • 以 RESTful 方式调用资源上的服务器端方法

    请记住 我对 REST 有初步的了解 假设我有这个网址 http api animals com v1 dogs 1 现在 我想让服务器让狗叫 只有服务器知道如何执行此操作 假设我想让它在 CRON 作业上运行 让狗在接下来的时间里每 10