2017-07-26 24 views
0

我们有一个网站来连接货物的买家和卖家。基于请求的body参数,API可以让restful POST api发回两个不同的资源吗?

我们正在设计POST API以捕捉买家对任何卖家产品的兴趣。 API Uri和请求正文如下所示:

/api/lead/ 
{ 
    "name":"xyz", 
    "mobile": "00984343", 
    "stockid":4 
} 

API是POST,因为我们会将此信息保存到数据库中。

目前,如果“stockid”是属于我们的优质客户股票中,API发回卖家细节API响应正文:

{ 
    "sellername":"abc", 
    "sellermobile":"75654647", 
    "selleraddress": "faje street, curl" 
} 

如果“stockid”是属于我们正常客户的股票,该API发送该产品的背面完整细节API响应体(和不发送回卖方详情)

{ 
    "description": "good 2nd hand mobile", 
    "purchasedate": "24 july,2017", 
    "purchaseprice": "10000" 
} 

同一职位的API发回2种不同类型的资源(一个是卖方详情,另一种是股票的详细信息)基于股票ID。

以这种方式设计API,即根据某些请求主体参数发送回各种类型的响应的POST API是否安定?

回答

0

这种做法看起来有问题。我个人不会那样做。

建议1:返回正常客户的产品详细信息,产品详细信息优质销售详细信息,作为丰富回应的形式。由于这两个响应大部分是一致的,你仍然有你想要的功能。

编辑:增加了我想到的更多建议。

建议2:由于这些反应基本不同,也许应该由不同的资源返回。在这种情况下,请勿在POST期间返回数据,只需使用ID拨打api/seller/{stockid}api/product/{stockid}即可返回响应,如果id对于特定资源无效,则返回No content。缺点是,您需要拨打很多电话,这使得架构复杂化。

建议3:为了避免完全不同的响应对象,这是令人困惑的,并且使客户端更难映射它们,请使用一些包装对象,它提供了一些“类型”属性和对象。例如:

{ 
    "type" : "premium", 
    "data" : { 
    "sellername":"abc", 
    "sellermobile":"75654647", 
    "selleraddress": "faje street, curl" 
    } 
} 

不完美,但在我看来比两个完全不同的反应更好。

+0

“POST应该用于创建对象” - 请为此提供参考。 –

+0

不确定什么可以作为客观参考,但资源在这[示例1]上相当一致[http://www.restapitutorial.com/lessons/httpmethods.html] [示例2](http://restcookbook.com/HTTP %20Methods/put-vs-post /) –

+0

从您的第一个参考文献开始,第二句话:“在某些场合下,使用PUT创建资源或使用POST更新资源是很有可能的,有效的甚至是首选。从您的第二个参考中,在“PUT”下:“但是,PUT也可用于在资源ID由客户端而不是服务器选择的情况下创建资源。” –

相关问题