Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于高级搜索/筛选的.Net WebAPI URI约定_Api_Rest_Asp.net Web Api - Fatal编程技术网

用于高级搜索/筛选的.Net WebAPI URI约定

用于高级搜索/筛选的.Net WebAPI URI约定,api,rest,asp.net-web-api,Api,Rest,Asp.net Web Api,我对微软的REST和WebAPI比较陌生。我们正在实现一个中心REST服务,该服务将容纳多种类型的对象GET和集合。作为项目的负责人,我的任务是设计出合适的Uri。我想知道对战争有什么想法更好。是的,我没有使用“标准”这个词,而是明确地分阶段进行 以下是我和我的团队目前正在考虑的选择: Http://servername/API/REST/Ldap/AD/employees?username=jsmith Http://servername/API/REST/Ldap/AD/employee/

我对微软的REST和WebAPI比较陌生。我们正在实现一个中心REST服务,该服务将容纳多种类型的对象GET和集合。作为项目的负责人,我的任务是设计出合适的Uri。我想知道对战争有什么想法更好。是的,我没有使用“标准”这个词,而是明确地分阶段进行

以下是我和我的团队目前正在考虑的选择:

Http://servername/API/REST/Ldap/AD/employees?username=jsmith 
Http://servername/API/REST/Ldap/AD/employee/UserName?searchTerm=jsmith (this seems RPC to me)
Http://servername/API/REST/Ldap/AD/employees/getusername?searchterm?jsmith
我们还创建了一个Soap版本,因此Uri中的其余部分就是Soap版本


感谢您的输入

我建议您看看Brian Mulloy的文章。在搜索和过滤方面,他有几个建议

简化关联-扫描“?”下的复杂性

大多数API的复杂性超出了资源的基本级别。 复杂性包括许多可以更新、更改的状态, 以及与资源关联的属性。成功 对于开发人员来说,通过设置可选状态来使用基本URL很简单 以及HTTP问号后面的属性。保持API的直观性 通过简化资源之间的关联,以及 HTTP问题掩盖下的参数和其他复杂性 马克

搜索提示

而简单的搜索可以建模为资源丰富的API(例如 例如,dogs/?q=red),跨多个资源进行更复杂的搜索 需要不同的设计。如果你想在全球范围内进行搜索 参考资料,我们建议您遵循谷歌模式:

全局搜索

/搜索?q=蓬松+毛发

这里,搜索是动词?q表示查询

范围搜索

若要将范围添加到搜索中,可以在前面加上 搜索。例如,搜索资源ID为5678的狗

/所有者/5678/狗?q=毛茸茸的+毛皮

请注意,显式搜索已从URL和 相反,它依赖参数“q”来指示作用域查询

分页和部分响应

通过在逗号中添加可选字段来支持部分响应 分隔列表

/狗?字段=名称、颜色、位置

使用“限制”和“偏移”可以方便开发人员分页 对象

/止动块?限值=25,偏移量=50


对于反对派的评论,这是我不久前整理的

公共类查询库
{
公共字符串查询{get;set;}
公共整数限制{get;set;}
公共整数偏移量{get;set;}
}
[路由(“/v1/用户”)]
公共类用户:IReturn
{
公共字符串Id{get;set;}
公共字符串名{get;set;}
公共字符串MiddleName{get;set;}
公共字符串LastName{get;set;}
公共字符串电子邮件{get;set;}
}
公共类RequestFilterAttribute:属性,IHasRequestFilter
{
#区域IHasRequestFilter成员
公共IHasRequestFilter副本()
{
归还这个;
}
公共整数优先级
{
获取{return-100;}
}
公共无效请求筛选器(IHttpRequest请求、IHTTpreponse请求、对象请求)
{
var query=req.QueryString[“q”]??req.QueryString[“query”];
var limit=请求查询字符串[“limit”];
var offset=请求查询字符串[“offset”];
var user=requestDto作为QueryBase;
如果(user==null){return;}
user.Query=Query;
user.Limit=Limit.IsEmpty()?int.MaxValue:int.Parse(Limit);
user.Offset=Offset.IsEmpty()?0:int.Parse(Offset);
}
#端区
}
[路由(“/v1/users/search”,“GET”)]
[请求过滤器]
公共类SearchUser:QueryBase,IReturn{}
公共类用户服务:服务
{
公共静态列表UserRepository=新列表
{
新用户{Id=“1”,FirstName=“Michael”,LastName=“A”,Email=“michaelEmail”},
新用户{Id=“2”,FirstName=“Robert”,LastName=“B”,Email=“RobertEmail”},
新用户{Id=“3”,FirstName=“Khris”,LastName=“C”,Email=“KhrisEmail”},
新用户{Id=“4”,FirstName=“John”,LastName=“D”,Email=“JohnEmail”},
新用户{Id=“4”,FirstName=“Lisa”,LastName=“E”,Email=“LisaEmail”}
};
公共页面结果获取(搜索用户请求)
{
var query=request.query;
var users=request.Query.IsNullOrEmpty()
?UserRepository.ToList()
:UserRepository.Where(x=>x.FirstName.Contains(query)| | x.LastName.Contains(query)| | | x.Email.Contains(query)).ToList();
var totalItems=users.Count;
var totalPages=(int)数学上限((十进制)totalItems/(十进制)请求限制);
var currentPage=request.Offset;
users=users.Skip(request.Offset*request.Limit).Take(request.Limit.ToList();
var itemCount=users.Count;
返回新页面结果
{
TotalItems=TotalItems,
TotalPages=TotalPages,
ItemCount=ItemCount,
项目=用户,
CurrentPage=CurrentPage
};
}
}

@Oppositinal-非常感谢这是一个非常好的信息。现在我想解释的另一件事是验证调用。例如,如果我想给开发人员提供一个验证票证号,那么我应该在url中添加一个动词,比如or或just,他们会得到一个nil吗??如果票证号是票证资源的唯一标识符,那么我将执行GET to/api/v1/tickets/1233,如果不存在具有该编号的票证,则返回404状态。如果您查看我链接到的API指南,它建议对于发送响应本身不是资源(不喜欢从数据存储返回的资源)的API调用,您应该使用动词而不是名词,例如/API/v1/validate?ticketId=1233链接文档似乎在某个登录墙后面,是否有其他位置用于此引用?