1

使用 GET 公开查询字符串参数时,我有以下基本 URL:

https://school.service.com/api/students

这将返回前 25 名学生。

如果我想根据以下条件之一返回学生列表怎么办:

* have accepted a job
* have received a job offer
* have no job offers

以上三个选项本质上是一个枚举。

因此,我假设没有工作机会的学生的查询请求如下所示:

https://school.service.com/api/students?jobOfferStatus=3

但是,我想知道 jobOfferStatus=3 是否是处理此问题的正确方法。如果是这样,我将如何向客户发布/提供该 jobOfferStatus 查询参数的可用选项列表?其他可能的查询参数及其有效选项呢?我们会有很多这样的可能的查询参数。

我很想看到一个应该如何正确完成的例子。最佳实践是什么?

4

2 回答 2

2

有两个主要选项:记录它,或使其可发现。许多 API 都有文档,其中列出了所有资源和参数以供参考。否则,客户不会知道。

您还可以通过在响应中包含选项以某种方式使其可被发现。有关这方面的约定,如果您还没有,请搜索 HATEOAS。(我自己对 HATEOAS 的了解还不够,无法提出建议。)

我会提到,“3”对于 jobOfferStatus 来说不是一个非常有意义的值,并且客户端不需要知道这个数字。您可以将其设为任何您想要的——jobOfferStatus=none 甚至 jobOffer=none。您的控制器可以完成将该值与您的枚举匹配的工作。尝试将您的界面设计为对开发人员来说是直观的(当然,还要编写好的文档)。

要处理多个查询参数,您可以在函数中使用可选参数:

public HttpResponseMessage GetStudents(string jobOffer = "",
                                        string other1 = "",
                                        string other2 = "") 
{
    if (jobOffer == "accepted" && other2 == "whatever") {
        // return a response
    }
    else {
        // return a different response
    }
}

当客户端使用这些名称的参数时,您可以适当地调整您的响应。

于 2013-11-11T21:13:33.017 回答
0

您有一些选择可以做到这一点,让我们尝试提供帮助:

1)配置到asp.net web api的通用路由知道如何解决与Getget方法不同的另一个动作的名称,在App_Start\WebConfigApi.cs类上,尝试添加:

config.Routes.MapHttpRoute("DefaultApiWithActionAndId",
            "api/{controller}/{action}/{id}",
            new { id = RouteParameter.Optional });

使用它,您可以在 api 控制器上使用不同的方法:

// request: get
// url: api/Students/GetStudents
public HttpResponseMessage GetStudents() 
{
   return Request.CreateResponse(...);
}

// request: get    
// url: api/Students/GetStudentsWithJobOffer
public HttpResponseMessage GetStudentsWithJobOffer() 
{
   return Request.CreateResponse(...);
}

// request: get    
// url: api/Students/GetStudentsAcceptedJob
public HttpResponseMessage GetStudentsAcceptedJob() 
{
   return Request.CreateResponse(...);
}

2)在方法上使用一个简单的参数Get

// request: get
// url: api/Students?jobOfferStatus=1       
public HttpResponseMessage GetStudents(int jobOfferStatus) 
{
    // use jobOfferStatus parameter to fill some list
   return Request.CreateResponse(...);
}

3) 使用带参数的简单方法,id通过 asp.net mvc web api 获取默认的友好 url。

// request: get
// url: api/Students/1      
public HttpResponseMessage GetStudents(int id) 
{
    // use the id parameter to fill some list
   return Request.CreateResponse(...);
}
于 2013-11-11T10:27:13.907 回答