首先,一些定义:
PUT在第9.6节RFC 2616中定义:
PUT方法请求将所包含的实体存储在提供的Request-URI下.如果Request-URI引用已经存在的资源,则封闭的实体应该被视为驻留在源服务器上的实体的修改版本.如果Request-URI未指向现有资源,并且该URI能够被请求用户代理定义为新资源,则源服务器可以使用该URI创建资源.
PATCH在RFC 5789中定义:
PATCH方法请求将请求实体中描述的一组更改应用于Request-URI标识的资源.
另外根据RFC 2616第9.1.2节, PUT是幂等的,而PATCH则不是.
现在让我们来看一个真实的例子.当我/users
使用数据进行POST {username: 'skwee357', email: 'skwee357@domain.com'}
并且服务器能够创建资源时,它将响应201和资源位置(假设/users/1
),并且/users/1
将返回对GET的任何下一次调用{id: 1, username: 'skwee357', email: 'skwee357@domain.com'}
.
现在假设我要修改我的电子邮件.电子邮件修改被视为"一组更改",因此我应该修补/users/1
" 补丁文档 ".在我的情况下,它将是一个json {email: 'skwee357@newdomain.com'}
.然后服务器返回200(假设权限正常).这让我想到第一个问题:
PATCH是一个相对较新的动词(2010年3月引入的RFC),它解决了"修补"或修改一组字段的问题.在引入PATCH之前,每个人都使用PUT来更新资源.但是在引入PATCH之后,让我感到困惑的是当时使用的PUT是什么?这让我想到了第二个(也是主要的)问题:
/users
替换整个集合.在引入PATCH之后,在特定实体上发布PUT是没有意义的.我错了吗?首先,可能没有正确答案,但我确信有些人比我更了解并且能够提供帮助.
我有3个实体:用户,博客,帖子.
系统可以包含任意数量的用户.
用户可以拥有任意数量的博客,但每个博客只有一个用户.
博客可以拥有与用户发布的帖子一样多的帖子,所有帖子都来自拥有博客的同一用户(即如果John拥有博客Food,只有John可以在此博客中发帖).当然,每个帖子都有一个父级博客.
然后我有用户个人资料页面,我想显示所有用户详细信息,他所有博客的名称,以及最近5个帖子.
我有一个博客页面,显示博客的详细信息,所有者的名称(用户)和所有帖子的标题.
然后我有帖子页面,显示帖子详细信息,博客名称和所有者名称.
如你所见,我在所有人之间都有关系,但他们都不能作为聚合.
在代码中定义实体并不困难,我所遇到的问题是定义存储库.我需要多少钱?3 - 每个实体一个?1 - 什么都有?我该如何进行查找?
例如,获取用户页面中的最后5个帖子.用户没有引用帖子,而是拥有一个博客容器,其中每个博客依次拥有帖子的容器.我的存储库中是否应该接受UserID并返回帖子列表?或者也许应该是服务?此外,我通常不会执行所有数据的加载,而是我有延迟加载.通过检索现有的用户实体,我不会加载其博客,除非需要它们(首次访问时).
提前致谢.
我在过去几天对DDD(领域驱动设计)很感兴趣,但我无法弄清楚谁创建和验证实体的责任.我会打破这个问题来涵盖不同的场景.
常规实体(可能带有价值对象).举个例子,我们可以选择一个由Email识别的用户.我有一个UserFactory接收一个数据数组(可能来自表单POST),并返回一个新的UserEntity.工厂应该验证数据的完整性(例如:作为电子邮件提供的字符串是真实的电子邮件,密码字段1和字段2中的密码匹配等)?工厂是否应该验证不存在此类用户(我们不想使用相同的电子邮件注册两个用户)?如果是,它应该是我自己还是使用UserRepository?
聚合实体.让我们假设我们有一个Post实体和Comments实体.我希望在帖子12中发表所有评论,所以我做了类似的事情
$ post = $ postRepository-> getById(12);
如何实现getById?像这样:
public function getById($id) {
$postData = $this->magicFetchFromDB($id);
$comments = (new CommentRepository())->getForPost(12);
return new PostEntity($postData, $comments);
}
Run Code Online (Sandbox Code Playgroud)
或者也许负责懒惰创建其评论的帖子,例如:
class PostEntity {
public function getComments() {
if(is_null($this->_comments)) $this->_comments = (new CommentRepository())->getForPost($this->_id);
return $this->_comments;
}
}
Run Code Online (Sandbox Code Playgroud)
?我在这里很丢失,没有足够的信息提供PHP中的DDD示例,所以任何帮助将不胜感激!
非常感谢,skwee.
首先,我没有找到任何有用的类似问题或材料.如果我错过了什么,我很抱歉!
其次,我对node-passport或connect-auth或everyauth这样的现成解决方案不感兴趣
现在回答这个问题.我正在使用Redis存储快速会话.我的问题是,当用户进行身份验证时(即在发布了用户名和密码的帖子并且在集合中找到了这样的用户之后)我应该在会话中存储什么?
我可以存储整个用户对象(例如,它来自MongoDB的方式).我看到的一个缺点是,当用户在DB中被修改(他编辑了他的个人资料)时,我必须在会话中"重新设置"用户对象.如果例如管理员更改了用户的配置文件,则会变得更加复杂 - 在这种情况下,会话不知道用户已被修改并且其数据需要从数据库刷新,因此会话当前持有过时的用户对象仅在用户下次登录时更新.
创建"hash => userid"的集合,并仅在会话中存储哈希.然后每个请求调用一个将检查的中间件(下面的伪代码,省略了对非现有哈希的检查,在这种情况下,用户可能被认为自会话过期后未登录):
if(userqsh in req.session)res.local.user = db.users.findById(db.sessions.findUserIdByHash(req.session.userhash));
这个方法明显的缺点是hash => userid的附加集合(即mongodb)或key => value(即redis)存储,这也需要一些程序来清理旧的会话哈希(将运行的计划任务\ cron和删除旧的过期哈希).
类似于#2的另一种解决方案,而不是使用3-d party collection/key => value storage,将散列存储为MongoDB中的部分User对象.但是,此方法会消除额外的collection/redis键值,但仍需要计划任务来清除旧的过期会话.并且由于过期会话可能会由"过期日期"属性定义,因此更容易维护活动会话的3-d方集合,而不是将会话相关数据放入MongoDB中的User对象(从而使User对象变得庞大).
我是Node-js的新手,这就是我要问的原因.我也明白,可能没有正确答案,或者可能与个人偏好有关.
谢谢!
我正在使用C++和pthreads进行一些事件处理.我有一个从我定义的事件队列中读取的主线程,以及一个填充事件队列的工作线程.队列当然是线程安全的.
工作线程有一个文件描述符列表,并创建一个epoll系统调用来获取这些文件描述符上的事件.它使用epoll_wait等待fd上的事件.
现在问题.假设我想彻底终止我的应用程序,我该如何正确取消工作线程?epoll_wait
不是pthread(7)的取消点之一,所以它无法正常反应pthread_cancel
.
工作线程main()看起来像这样
while(m_WorkerRunning) {
epoll_wait(m_EpollDescriptor, events, MAXEVENTS, -1);
//handle events and insert to queue
}
Run Code Online (Sandbox Code Playgroud)
该m_WorkerRunning
设置为true
线程启动时,它看起来像我可以中断线程通过设置m_WorkerRunning
从主线程为false.问题是epoll_wait
理论上可以永远等待.
我解决的其他解决方案是:不是永远等待(-1)我可以等待X时隙,然后正确处理无事件情况,m_WorkerRunning == false
然后退出循环并彻底终止工作线程.主线程然后设置m_WorkerRunning
为false,并且睡眠X.但是我不确定这样的epoll_wait的性能,也不确定什么是正确的X?500ms的?1秒?10秒?
我想听听一些经验丰富的建议!
更多相关信息:fd我正在等待事件,/dev/input
技术上的设备我正在做某种输入子系统.目标操作系统是ARM体系结构上的Linux(最新内核).
谢谢!
我正在编写基于nodejs的rest API.
我的API有不同的方法,比如put/friends将用户添加到当前登录用户的朋友列表中.
我想通过不同的方法(推送通知,邮件等)通知其他用户,他已被添加为朋友.我不想在API流程中进行通知,而是想发布另一个nodejs处理的事件(可能甚至在不同的机器上运行),拾取并执行通知工作.
实现此类架构的可接受方法有哪些?这里的关键是我想要不同的 nodejs进程之间的pub/sub模式甚至可能不共享同一台机器,所以我想常规的EventEmitter不会帮助那里.
感谢帮助!