【问题标题】:Cannot accept post in Sinatra using Curl无法使用 Curl 在 Sinatra 中接受帖子
【发布时间】:2012-03-02 22:38:15
【问题描述】:

刚刚修补 Sinatra 并试图让一个安静的 Web 服务运行起来。 不过,我目前遇到的错误非常具体。

以这个post方法为例

post '/postMan/:someParam' do
    #Edited here. This code can be anything. 411 is still the response
    puts params[:someParam]

end

看起来很简单。获取一个参数,从中创建一个对象,然后以对象保存方法定义的任何方式存储它。

这是我使用 Curl 发布数据的方法

$curl -I -X POST http://127.0.0.1/postman/123456

唯一的问题是,我收到了 411,但不知道为什么。 据我所知,411 是必需的长度。这是痕迹

HTTP/1.1 411 Length Required 
Content-Type: text/html; charset=ISO-8859-1
Server: WEBrick/1.3.1 (Ruby/1.9.2/2011-07-09)
Date: Fri, 02 Mar 2012 22:27:09 GMT
Content-Length: 303
Connection: close

我“不能”以任何方式更改 curl 消息。那么有没有人可以设置在 sinatra 中忽略的内容长度?或者一些不涉及更改 curl 请求的修复?


为了记录,我是否使用 Post 方法中的参数都没有关系。我里面可能有一些疯狂的代码,它仍然会抛出同样的错误

【问题讨论】:

  • 当您实际发布数据(例如使用-d key=val)时,您会得到相同的结果吗?
  • @nategood 我对 curl 不太熟悉。如果这是正确的 'curl -d key=val 127.0.0.1:4567/postman/123456' 那么响应是默认的 sinatra 404(AKA sinatra 不知道这个小曲)
  • 试试curl -I -X POST -d "key=val" http://127.0.0.1/postman/123456
  • @nategood 响应是““警告:您只能选择一个 HTTP 请求!”,抱歉,这可能是我做错了。

标签: ruby rest post curl sinatra


【解决方案1】:

正如上面其他人所说,WEBrick 错误地要求 POST 请求具有 Content-Length 标头。我只是传递一个空的正文,因为它比传递标题要少打字:

curl -X POST -d '' http://webrickwhyyounotakeemptyposts.com/

【讨论】:

    【解决方案2】:

    您确定您的应用在端口 80 上吗? 当我跑步时:

    ruby -r sinatra -e "post('/postMan/:someParam'){puts params[:someParam]}"
    

    卷曲它:

    curl -I -X POST http://127.0.0.1:4567/postMan/123456                                                                            
    HTTP/1.1 200 OK
    X-Frame-Options: sameorigin
    X-XSS-Protection: 1; mode=block
    Content-Type: text/html;charset=utf-8
    Content-Length: 0
    Connection: keep-alive
    Server: thin 1.3.1 codename Triple Espresso
    

    没关系。不得不将 URL 更改为 postMan,但您的示例抛出了 404,因为您有 postman

    输出也符合预期:

    == Sinatra/1.3.2 has taken the stage on 4567 for development with backup from Thin
    >> Thin web server (v1.3.1 codename Triple Espresso)
    >> Maximum connections set to 1024
    >> Listening on 0.0.0.0:4567, CTRL+C to stop
    123456
    

    【讨论】:

    • 我认为它在默认端口:4567 上运行。我已经尝试过你的方法,但也许它与我的 sinatra 设置有关。一件事,我用的是webrick,不瘦
    • 天哪,你做到了!!!!我从 webrick 切换到瘦。突然之间,它开始工作。也许 webrick 不考虑内容长度。非常感谢!
    • thin 在较新的 sinatra 版本中是默认的。我永远不会考虑使用 webrick。这就像场上最慢的球员。使用瘦或美洲狮!
    【解决方案3】:

    啊。不用-I 试试。它可能正在发送HEAD 请求,因此,没有发送您期望的内容。如果要显示标题,请使用 -v

    curl -v -X POST http://127.0.0.1/postman/123456
    
    curl -v -X POST -d "key=val" http://127.0.0.1/postman/123456
    

    【讨论】:

    • 遗憾的是这不起作用。请求的输出在这里。它仍然给出 411。pastebin.com/t9rumPAu 记住,在最终版本中。我无法更改 curl 命令。
    【解决方案4】:

    WEBrick 错误地要求 POST 请求包含 Content-Length 标头。

    curl -H 'Content-Length: 0' -X POST http://example.com
    

    不过,POST requests don't require a body 是标准的,因此不需要 Content-Length 标头。

    【讨论】:

    • 我对 PUT 请求有同样的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    相关资源
    最近更新 更多