应该api调用是GET还是POST

时间:2011-02-08 20:51:56

标签: php api

我注意到一些像twitter API这样的API使用get方法来处理所有内容,因此参数会像这样在url中传递

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

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

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

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

  3. 另一个问题是我听到网址有最大长度,所以我想这会让GET不受影响,或者是否有解决方法

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


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

    1. 当我在谈论不想在网址中发送密钥时,我的意思是,如果用户要为通话添加书签,我不希望将该密钥加入书签,而不是我不想要钥匙暴露在外。所以我想从答案中,我可以在标题字段中发送它?还有其他选择吗?

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

    3. 重新判断它是否是RESTful:我之前使用MVC框架完成了RESTful,该框架负责检测动词,最终看起来像example.com/entry/1example.com/entry/和http动词是控制正在执行的操作(创建,更新,删除,列表)的内容。在实际意义上,我认为RESTful对于类似crud的数据最有用(创建条目,获取条目,更新条目,删除条目,显示所有条目)。所以如果我不需要crud,我需要REST吗?我的问题:如果一个调用只是提供输入并返回输出,那么这个API是否需要RESTful?网址看起来不像RESTful,那么实现中还有其它东西可以使它成为RESTful吗?

    4. 关于网址大小,您评论了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)我正在读取元数据并修改文件中的元数据并返回修改后的文件(应该是GET或POST)。
      • 所以这是我可能需要发送大数据的一个例子。问题是(a)和(b)是否考虑过GET或POST操作?这就是我询问URL最大长度
      • 的原因

5 个答案:

答案 0 :(得分:28)

  

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

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

  

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

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

  

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

HTTP标准没有定义最大URL长度,但some browsers强加了一个。这可能与通过JavaScript生成GET请求无关,但如果您非常关注它,您可能应该重新考虑您的API。 GET请求不应该向服务器发送那么多数据。

  

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

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

答案 1 :(得分:3)

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

以下是您的问题的简短答案:

  

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

这取决于你在做什么。

  

我正在编码的API需要一个密钥,而且   我不认为发送是个好主意   它在URL中。所以有可能   混合POST参数和URL   参数Δ

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

  

另一个问题是我听到了网址   有最大长度,所以我猜   会让GET脱离困境,或者是   有一个解决方法

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

  

我遇到的唯一问题是POST   (我猜的是为什么一个网站   就像twitter和GET一样去了   请求无法直接进行   来自浏览器。如果我是,请纠正我   错了。

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

答案 2 :(得分:2)

正如Anon所说,获取用于检索数据,发布更改/发送数据,这使您符合http标准。 AFAIK,你不能混合GET / POST参数。您可以通过表单从浏览器发出帖子请求,但不能通过地址栏输入网址信息。 get字符串与post字符串中的键并没有太大的不同。如果请求在传输过程中被截获,则密钥会以任何方式受到攻击。如果使用公钥/私钥对加密密钥,则可以解决该问题。是的,GET字符串确实有最大长度,但发布也是如此,虽然更大并且取决于您的服务器设置。

答案 3 :(得分:1)

从服务器的角度来看,使用什么机制并不重要。服务器端唯一有意义的区别是GET请求通常是完全记录的(带参数),而POST请求的数据通常不会被记录(但这不是自定义服务器的规则,可以记录或不记录任何内容) 。

此外,在许多情况下,您可以使用GET或POST,服务器将正确和透明地处理这两种情况。混合也是可能的,大多数服务器也会透明地处理。

GET请求更容易调试(对于Web开发人员),也许这是使用它们的主要原因。我还可以认为GET请求更容易处理并且资源消耗更少(但这取决于代码的编写方式),因为在GET请求中,所有内容都在头文件中传递,而CRLFCRLF是一个请求分隔符(使用POST它是必要的执行额外的身体解析)。

网址确实有最大值。长度(4K是常见限制,但不是强制性的),是的。某些代理和某些服务器(可能还有一些客户端)可能无法处理较大的URL或具有人为限制(以防止攻击)。

我不确定我是否理解您的“无法直接从浏览器发出请求”的想法。当您在浏览器中填写Web表单时,它会被POST到服务器(除非使用JavaScript或AJAX,因此使用它们可以获得GET请求)。

答案 4 :(得分:0)

为什么不同时支持?这是最灵活的。我只编写了一个API(多个版本),并且它支持所有变量的GET和POST,在实现客户端和调试时都派上了用场。它支持混合和匹配GET和POST。使用$ _REQUEST并完成。