我有一个人的设计,有一系列科目 人--->主题(1对多)
如果我访问ID为1(http://localhost/person/1
)的人,
它将显示所有人的详细信息和收集细节。
如何设计网址以仅访问此人的主题?
应该是吗?
http://localhost/person/1/subjects
?
我可以发布到该URL以添加主题吗?
我可以使用该URL更新主题吗?
什么处理程序应该处理一个人的主题? 它应该是具有Get和personid参数的主题处理程序还是 人员处理程序使用主题的返回方法返回主题集合?
答案 0 :(得分:1)
从ReST的角度来看,最重要的是,URI只是不透明的标识符,因此它们的结构是一个正交的问题。
从OR的角度来看,你可以只注册AtUri(“/ person / {id} / subjects / {subjectid}”)并让你的方法签名为Post(int id,int subjectid),工作很好。
现在从设计的角度来看,任何独立访问的内容都是另一个资源,因此主题和每个主题的集合都是独立的资源。 OR做了很多假设,依赖于你独立地映射每个独立资源,否则像URI创建这样的东西会很快崩溃。
答案 1 :(得分:0)
在上述情况下,如果需要使用CreateUri扩展方法在对象上创建超媒体链接,则需要将父ID添加到子对象。
using System;
using System.Collections.Generic;
using OpenRasta.Codecs.Razor.TestApp.Codecs;
using OpenRasta.Configuration;
using OpenRasta.Web;
namespace OpenRasta.Codecs.Razor.TestApp
{
public class Configuration : IConfigurationSource //, IDependencyResolverFactory
{
public void Configure()
{
using (OpenRastaConfiguration.Manual)
{
ResourceSpace.Has.ResourcesOfType<Person>()
.AtUri("/person/{personId}")
.HandledBy<PersonHandler>()
.AsXmlDataContract();
ResourceSpace.Has.ResourcesOfType<Subject>()
.AtUri("/person/{personId}/subjects/{subjectId}")
.HandledBy<SubjectHandler>()
.AsXmlDataContract();
}
}
}
public class SubjectHandler
{
public Subject Get(int personId, int subjectId)
{
var subject = new Subject()
{Name = string.Format("Person {0} Subject {1}", personId, subjectId), SubjectId = subjectId}; //PersonId = personId
Uri link = subject.CreateUri(); //this line will fail unless Subject has personId property.
subject.Link = link.AbsoluteUri;
return subject;
}
}
public class Subject
{
//public int PersonId {get; set;} //Need to add Parent link if using CreateUri() for OR to create link
public int SubjectId { get; set; }
public string Name { get; set; }
public string Link { get; set; }
}
public class PersonHandler
{
public Person Get(int personId)
{
return new Person() {Name = "Test" + personId, PersonId = personId};
}
}
public class Person
{
public int PersonId { get; set; }
public string Name { get; set; }
}
}