【问题标题】:Sinatra not sending headersSinatra 不发送标头
【发布时间】:2014-07-16 12:55:52
【问题描述】:

我无法发送带有 Thin/sinatra 的标头。我正在尝试执行 CORS 请求。我尽量简单。

我尝试了 sinatra cors 模块。我尝试自己添加标题,如下所示。当我使用 ngnix 并从那里强制标头时,我让它工作了。但我试图理解为什么从应用程序发送标头不起作用......

› gem list sinatra

*** LOCAL GEMS ***

sinatra (1.4.5)

contact.rb

require 'sinatra'
require 'json'

options '/*' do
  p "options hit"
  headers  "Access-Control-Allow-Headers" => "origin, x-requested-with, content-type"
    status 200
end

post '/' do
  p params.inspect
  headers \
    "Access-Control-Allow-Origin" => "*",
    "Access-Control-Allow-Methods" => "POST",
    "Access-Control-Allow-Headers" =>  "Content-Type",
    "Access-Control-Max-Age" => "86400"
  {:status => "error", :message => "no email"}.to_json
end

**all.js**

    // Contact form submission
    $(document).ready(function() {

        $('#contactForm').submit(function() {

            $.ajax({
                type: "POST",
                url: "http://localhost:4567/",
                data: $("#contactForm").serialize(),
                dataType: "json",

                success: function(msg) {
                    $("#formResponse").removeClass('error');
                    $("#formResponse").removeClass('success');
                    $("#formResponse").addClass(msg.status);
                    $("#formResponse").html(msg.message);

                },
                error: function() {
                    $("#formResponse").removeClass('success');
                    $("#formResponse").addClass('error');
                    $("#formResponse").html("There was an error submitting the form. Please try again.");
                }
            });
        });
    });

输出

    › ruby contact.rb
== Sinatra/1.4.5 has taken the stage on 4567 for development with backup from Thin
Thin web server (v1.6.2 codename Doc Brown)
Maximum connections set to 1024
Listening on localhost:4567, CTRL+C to stop
"options hit"
127.0.0.1 - - [21/Jul/2014 11:34:59] "OPTIONS / HTTP/1.1" 200 - 0.0059

浏览器请求

Remote Address:127.0.0.1:80
Request URL:http://cooldevops.dev/
Request Method:POST
Status Code:405 Method Not Allowed
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8,nl;q=0.6
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:16
Content-Type:application/x-www-form-urlencoded
Host:cooldevops.dev
Origin:http://cooldevops.dev
Referer:http://cooldevops.dev/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
Form Dataview sourceview URL encoded
email:
mailbody:
Response Headersview source
Connection:keep-alive
Content-Length:19
Content-Type:text/plain
Date:Wed, 16 Jul 2014 12:47:06 GMT
X-Cascade:pass

编辑

我在使用 safari/chrome 时遇到了错误。使用 curl 时,它似乎可以工作。所以它变得更加奇怪了。

2.0.0-p247 in gtheys/
› curl -v -X POST http://localhost:4567
* Adding handle: conn: 0x7f8efc815000
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x7f8efc815000) send_pipe: 1, recv_pipe: 0
* About to connect() to localhost port 4567 (#0)
*   Trying ::1...
*   Trying fe80::1...
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 4567 (#0)
> POST / HTTP/1.1
> User-Agent: curl/7.30.0
> Host: localhost:4567
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/html;charset=utf-8
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Methods: POST
< Access-Control-Allow-Headers: Content-Type
< Access-Control-Max-Age: 86400
< Content-Length: 39
< X-XSS-Protection: 1; mode=block
< X-Content-Type-Options: nosniff
< X-Frame-Options: SAMEORIGIN
< Connection: keep-alive
* Server thin 1.6.2 codename Doc Brown is not blacklisted
< Server: thin 1.6.2 codename Doc Brown
<
* Connection #0 to host localhost left intact
{"status":"error","message":"no email"}%

【问题讨论】:

    标签: jquery sinatra thin


    【解决方案1】:

    问题不是 CORS。但我蹩脚的jQuery实现。所以千万不要抄袭!

    【讨论】:

      【解决方案2】:

      根据Setting Body, Status Code and Headers 上的文档:

      和body类似,也可以设置状态码和headers:

      get '/foo' do
        status 418
        headers \
          "Allow"   => "BREW, POST, GET, PROPFIND, WHEN",
          "Refresh" => "Refresh: 20; http://www.ietf.org/rfc/rfc2324.txt"
        body "I'm a tea pot!"
      end
      

      它是 headers 而不是 response.headers

      您还可以通过块中的响应值设置标头,请参阅Return Values

      【讨论】:

      • 这是我尝试的第一个 :) 并且它产生了同样的问题:HTTP/1.1 405 Method Not Allowed
      • 也许这是一个 Rack::Protection 设置,看看stackoverflow.com/q/10509774/335847 看看这些答案是否有帮助。
      • 我已经试过了。但我只在使用浏览器时收到错误消息。当我使用 curl 时,它可以正常工作...
      • @gtheys 这个 Chrome 扩展程序被列入白名单的呢? stackoverflow.com/a/14532270/335847
      • 搜索并尝试了我在 google/stackoverflow 上可以找到的所有内容。但继续调试并认为我发现了问题。有问题的不是sinatra。但是我使用 anvil for mac 来运行静态网站。这个网络服务器似乎在 sinatra 可以发回回复之前关闭了连接。我将尝试为静态站点使用另一个网络服务器和联系表单。
      猜你喜欢
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 2016-06-17
      • 1970-01-01
      • 2016-10-06
      • 2014-01-10
      • 2018-01-28
      • 1970-01-01
      相关资源
      最近更新 更多