我在我们的API中添加了一个新的REST服务,并希望在最佳REST API上提供一些意见。该服务用于检索用户的电子邮件地址,以防他们忘记了用户名。该服务需要三个参数:
如果我们找到这三条信息的匹配项,则服务返回JSON包含用户注册的电子邮件地址的掩码版本(例如jo******@gmail.com
),以便UI可以显示消息类似于"我们将您的用户名发送到j******@g******.com
。那可以吗?"
请注意,该服务实际上并未真正更改其帐户中的任何内容或发送电子邮件(这是纯粹的提取信息,以便用户可以确认下一步),因此在我看来,GET请求是要走的路。问题是如何代表它?令我感到震惊的是/users
是一个合理的起点(?),但那又是什么?使用URL路径,我可能会得到类似的结果:
/users/accountEmail/accountNumber/123456/surname/Smith/dateOfBirth/25-12-1970
这似乎很蹩脚,因为通常我们的/users
网址包含用户名(例如/users/john/transactions
),但很明显,对于此API通话,我们实际上并不知道用户是谁。我也不确定它是否真正表明服务实际上做了什么。或者,我可以使用URL查询参数:
/users/accountEmail?accountNumber=123456&surname=Smith&dateOfBirth=25-12-1970
这个感觉更自然,但我不确定将所有这些输入参数串在URL中是个好主意。然后,也许/users
可能是错误的名词。也许应该是这样的:
/accountEmail/...
说了这么多,也许给了服务的幂等性,我实际上可以使用PUT
请求并将参数编码到HTTP正文中。不确定是否使用PUT
进行只读请求...它似乎有点像沿着RPC路径前进。关于PUT
方法的一个好处是,它不会将这个相对敏感的用户输入记录到任何Web服务器日志中。
我对意见或听取其他API开发人员在类似情况下所做的事情感兴趣。感谢。
答案 0 :(得分:1)
首先,不要在URL参数或URL路径中使用方法GET和敏感信息,因为该信息可以存储在Web服务器访问日志文件,浏览器历史记录,HTTP代理日志文件等中。
安全方面,在这种情况下你需要使用方法POST。关于要使用的URL,我不太确定,可能类似于/ accounts并将所有参数放到请求主体中。
答案 1 :(得分:0)
你的第二种方法是我会用的。从逻辑上讲,URL是按照以下步骤构建的。
用户的收集资源
网址
GET /users
返回所有用户的列表,包括所有用户属性。
[
12345: {
"surname": "Smith",
"firstname": "John",
"dateOfBirth": "1970-12-25",
"accountEmail": "john.smith@example.com"
},
6789 : {
"surname": "Hallow",
"firstname": "Jane",
"dateOfBirth": "1981-02-15",
"accountEmail": "jane.hallowh@example.com"
}
]
用户电子邮件的子收集资源
网址
GET /users/accountEmail
为所有用户返回alf 所有电子邮件。
[
12345: {
"accountEmail": "john.smith@example.com"
},
"accountEmail": "jane.hallowh@example.com"
}
]
过滤此资源
网址
GET /users/accountEmail?accountNumber=123456&surname=Smith&dateOfBirth=25-12-1970
为符合查询参数的用户返回过滤的电子邮件列表。
[
12345: {
"accountEmail": "john.smith@example.com"
}
]