我注意到像 Twitter API 这样的一些 API 对所有东西都使用 get 方法,所以参数是这样在 URL 中传递的:
http://api.twitter.com/1/statuses/user_timeline.json?screen_name=screenname
我有一些问题,希望得到评论或更正:
我一直认为使用 GET 不是一个好主意,使用 POST 更好。
我正在编写的 API 需要一个 key ,我认为在 URL 中发送它不是一个好主意。那么,是否可以混合使用 POST 参数和 URL 参数?
另一个问题是我听说 URL 有最大长度,所以我想这会使 GET 无法使用,或者有解决方法吗?
我在 POST 中看到的唯一问题(我猜这是为什么像 twitter 这样的网站使用 GET)是不能直接从浏览器发出请求。如果我错了,请纠正我。
更新:感谢所有帮助我集思广益的人。我有一些更新来澄清一些评论。
当我谈到不想在 URL 中发送 key 时,我的意思是如果用户要为调用添加书签,我不希望将 key 添加为书签,而不是我不想 key 完全暴露了。所以我从答案中猜想我可以在标题字段中发送它?还有其他选择吗?
我想澄清一下,当我说 POST 请求不能从浏览器发出时,我应该说,POST 请求不能从 URL 发出 如 http://example.com/api/op.json?param=value。对不起,我说错了,应该更清楚。
关于它是否是 RESTful:我之前使用 MVC 框架完成了 RESTful,该框架负责检测动词,URL 最终看起来像 example.com/entry/1 或 example.com/entry/ 和 HTTP 动词控制正在执行的操作(创建、更新、删除、列表)。我认为,在实际意义上,RESTful 对于类似 crud 的数据(创建条目、获取条目、更新条目、删除条目、显示所有条目)最有用。所以如果我不需要 crud,我还需要 REST 吗?我的问题:如果一个调用只是提供输入并返回输出,这个 API 是否需要是 RESTful 的?该 URL 看起来不像 RESTful,那么实现中是否有其他东西可以使其成为 RESTful?
至于 URL 大小,您在 中发表了评论,但如果您非常关心它,您可能应该重新考虑您的 API。 GET 请求不应该向服务器发送那么多数据。 所以我有这个例子:用户想要发送一个大文件。在服务器上,我不会将文件输入数据库或保存它(所以根据标准我不是“发布”数据),但也许我是(这些都是快速思考的例子,所以请不要太在意) :
最佳答案
1. I always thought that using GET is not a good idea and that it's better to use POST.
使用 GET 读取信息,使用 POST 写入信息。 GET 请求不应该修改服务器端状态,而 POST 请求可以安全地这样做。通常使用 GET 进行读取,使用 POST 进行写入。您的 API 可能应该混合使用两者,具体取决于每个特定 API 调用的用途。
2. The API I'm coding requires a key, and I don't think it's a good idea to send it in the URL. So is it possible to mix both POST parameters and URL parameters?
通过 POST 发送数据根本不会增加任何安全级别。 GET 请求的安全性不亚于 POST 请求;它们是相同的。要传输私有(private)数据,请使用 SSL。
理想情况下,您应该使用像 Authorization 这样的 HTTP header 来传输 key ,因为这不太可能被中介记录,或者被发送到错误跟踪器等第三方服务。
3. Another problem is that I hear URLs have a max length, so I guess that would make GET out of the way, or is there a workaround
虽然some browsers 没有定义HTTP 标准的最大URL 长度。强加一个。在通过 JavaScript 生成 GET 请求时,这可能无关紧要,但如果您非常担心它,您可能应该重新考虑您的 API。 GET 请求不应该向服务器发送那么多数据。
4. The only problem I'm seeing with POST (and which I'm guessing is why a site like twitter went with GET) is that the request can't be made directly from the browser. Correct me if I'm wrong on this.
您的浏览器可以像 GET 请求一样轻松地生成 POST 请求,只是通过地址栏提交 POST 请求更加困难。
关于php - API 调用应该是 GET 还是 POST?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4938276/
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou
我知道您通常应该在Rails中使用新建/创建和编辑/更新之间的链接,但我有一个情况需要其他东西。无论如何我可以实现同样的连接吗?我有一个模型表单,我希望它发布数据(类似于新View如何发布到创建操作)。这是我的表格prohibitedthisjobfrombeingsaved: 最佳答案 使用:url选项。=form_for@job,:url=>company_path,:html=>{:method=>:post/:put} 关于ruby-on-rails-rails:Howtomak
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent