API 调用应该是 GET 还是 POST?

2022-08-30 17:45:29

我注意到一些API(如Twitter API)使用get方法进行所有操作,因此参数在URL中传递,如下所示:

http://api.twitter.com/1/statuses/user_timeline.json?screen_name=screenname

我有一些问题,并希望得到评论或更正:

  1. 我一直认为使用GET不是一个好主意,最好使用POST。

  2. 我正在编码的API需要一个密钥,我认为在URL中发送它不是一个好主意。那么,是否可以混合使用POST参数和URL参数?

  3. 另一个问题是我听到URL有一个最大长度,所以我想这会让GET摆脱困境,或者有解决方法吗?

  4. 我在POST中看到的唯一问题(我猜这是为什么像twitter这样的网站使用GET)是请求不能直接从浏览器发出。如果我错了,请纠正我。


更新:感谢所有帮助我集思广益的人。我有一些更新来澄清一些评论。

  1. 当我谈论不想在URL中发送密钥时,我的意思是,如果用户要为呼叫添加书签,我不希望密钥被添加为书签,而不是我根本不希望密钥公开。所以我想从答案中,我可以在标题字段中发送它吗?还有其他选择吗?

  2. 我想澄清一下,当我说POST请求时,我应该说,如.对不起,我说错了,应该更清楚。can't be made from the browserPOST requests can't be made from the URLhttp://example.com/api/op.json?param=value

  3. 关于它是否是RESTful:我以前用一个MVC框架做过RESTful,该框架负责检测动词和URL最终看起来像,或者HTTP动词是控制正在执行的操作(创建,更新,删除,列表)的原因。我认为,从实际意义上讲,RESTful对于类似crud的数据最有用(创建条目,获取条目,更新条目,删除条目,显示所有条目)。那么,如果我不需要 crud,我需要 REST 吗?我的问题是:如果调用只是简单地提供输入并返回输出,那么这个API是否需要是RESTful?URL看起来不是RESTful,那么实现中是否有其他东西可以使其RESTful?example.com/entry/1example.com/entry/

  4. 至于URL大小,你评论了所以我有这个例子:用户想要发送一个大文件。在服务器上,我不会将文件输入数据库或保存它(所以根据标准,我不会“发布”数据),但也许我是(这些都是快速思考的例子,所以请松散地接受它们):but if you're seriously concerned about it you probably should rethink your API. GET requests shouldn't be sending that much data to the server.

  • (a) 读取文件的元数据并将其返回(应为 GET 还是 POST),或
  • (b)我正在读取元数据并修改文件上的metada并返回修改后的文件(应该是GET还是POST)。
  • 因此,这是为什么我可能需要发送大型数据的一个例子。问题是(a)和(b)被认为是GET还是POST操作?这就是为什么我问URL最大长度的原因

答案 1

1.我一直认为使用GET不是一个好主意,最好使用POST。

使用 GET 读取信息,使用 POST 写入信息。GET 请求不应修改服务器端状态,而 POST 请求可以安全地修改服务器端状态。通常使用 GET 进行读取,POST 进行写入。您的 API 可能应该同时使用两者,具体取决于每个特定 API 调用的用途。

2.我正在编码的API需要一个密钥,我认为在URL中发送它不是一个好主意。那么是否可以混合使用POST参数和URL参数?

通过POST发送数据根本不会增加任何安全级别。GET请求的安全性不亚于POST请求;它们是相同的。要传输私人数据,请使用 SSL。

理想情况下,您应该使用HTTP标头来传输密钥,因为这不太可能被中介记录,或者被发送到第三方服务(如错误跟踪器)。Authorization

3.另一个问题是我听到URL有最大长度,所以我想这将使GET摆脱困境,或者有解决方法

HTTP标准没有定义的最大URL长度,尽管某些浏览器会强制使用。在通过 JavaScript 生成 GET 请求时,这可能并不重要,但是如果你非常担心它,你可能应该重新考虑你的 API。GET 请求不应该向服务器发送那么多数据。

4.我在POST中看到的唯一问题(我猜是为什么像twitter这样的网站使用GET)是请求不能直接从浏览器发出。如果我错了,请纠正我。

您的浏览器可以像GET请求一样轻松地生成POST请求,但通过地址栏提交POST请求变得更加困难。


答案 2

更全面的答案是:请阅读一般的REST和HTTP动词。

以下是对您的问题的一些简短回答:

我一直认为使用GET不是一个好主意,最好使用POST。

这取决于你在做什么。

我正在编码的API需要一个密钥,我认为在URL中发送它不是一个好主意。那么是否可以混合使用POST参数和URL参数?

是的,这是可能的。但是,通过 URL 发送它与请求正文之间实际上没有太大的安全差异。

另一个问题是我听到URL有一个最大长度,所以我想这会让GET摆脱困境,或者是否有解决方法

“解决方法”是使用其他动词(如POST或PUT)来传输大量数据。

我在POST中看到的唯一问题(我猜这是为什么像twitter这样的网站使用GET)是请求不能直接从浏览器发出。如果我错了,请纠正我。

POST请求可以通过使用带有的简单HTML直接从浏览器发出。<form>method="POST"


推荐