加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 外部服务/ API请求和响应的抽象

发布时间:2020-12-13 22:50:53 所属栏目:PHP教程 来源:网络整理
导读:TLDR: Writing a service (in the model layer). It talks to ffmpeg. Where should validation go? Should I create a service response object so it is testable? How should it be structured? Background: I’m designing some classes to retrieve dat

TLDR: Writing a service (in the model layer). It talks to ffmpeg. Where should validation go? Should I create a service response object so it is testable? How should it be structured?

Background: I’m designing some classes to retrieve data from an external service. It could be an API,but in fact it’s calls to ffmpeg cli,which in effect is an API to the conversion tools themselves.

在与外部服务交谈时,检索到的数据可能并不总是相同,最好是在最终保持至少一致的应用程序状态,以便您的应用程序不依赖外部服务工作?

到目前为止,我已经将这些类分开,试图在其中保留SRP:

class CommandDispatcher { }

Command Dispatcher的唯一工作是发出数据请求(到ffmpeg)并检索该数据的响应.

class Converter { }

转换器的唯一责任是接受用户请求(如转换为1到2),并将基础知识发送到处理exec()调用的命令调度程序.

这是我的问题:

>在与外部API /服务交谈时,我是否应该创建APIRequest和APIResponse对象(在本例中为FFmpegResponse对象)?

我已经看到OAuth的示例,其中有一个OAuth响应对象.但是,这很简单,因为对此的调用是通过HTTP协议完成的,该协议往往至少会返回错误代码和消息.调用ffmpeg之类的东西并不能保证类似的响应(例如,可能没有安装ffmpeg).这个对象只是一个域对象(即一个实体:一些类成员和setter和getter)?

>验证.如果我正在创建一个FFmpegResponse对象,其作用是将数据放入Response对象的正确成员中?

想象一下,未安装ffmpeg,CommandDispatcher将响应返回为空.是由CommandDispatcher然后用“ffmpeg not installed”错误填充FFmpegResponse对象?我应该有验证对象吗?

请记住,我在这里坚持单一责任原则,所以我认为CommandDispatcher不应该关心数据是否有效 – 它应该只是要求数据并检索它.我的验证在这个服务的模型层中适合哪里?

这不仅适用于FFmpeg,还有助于未来的外部服务呼叫.无论外部服务是否以预期的方式响应,构建代码和类以维护SRP以及一致的应用程序状态的最佳[实践]方法是什么?

解决方法

在当前结构中,CommandDispatcher应该是接口或抽象类(取决于抽象代码的必要性).然后,您将创建一个具体的实现:FFMpegCommandDispatcher,它将封装对ffmpeg特定响应的理解.

然后响应对象将采用类似的结构:CommandResponse将是具有FFMpegCommandResponse具体实现的抽象.

最好创建一组常见的错误条件(serviceNotAvailable,serviceNotInstalled,serviceDiedAHorribleAndBloodyDeath等).然后,您的调度程序实现可以在响应对象和提供程序实现特定详细信息上设置常见错误代码. (‘错误1984:FFMpeg在看着你’)

如果你担心(我会)关于验证输入.您可以创建一个CommandRequest抽象和FFMpegRequest实现,它将获取用户输入并确保可以将其发送到命令行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读