代码之家  ›  专栏  ›  技术社区  ›  Perrier

启用Webiopi CORS请求

  •  1
  • Perrier  · 技术社区  · 6 年前

    我想在Raspberry上运行的浏览器中从angular应用程序调用Webiopi REST API。由于Webiopi HTTP服务器不允许CORS请求,我使用apache创建了一个代理,用于发送 Header add "Access-Control-Allow-Origin" "*" 标题。

    这工作正常,但是调用RESTAPI会引发许多错误,主要是因为浏览器向服务器发送选项请求,以防CORS请求检查是否允许。但是webiopi http处理程序根本不处理选项动词。

    def do_OPTIONS(self):
        self.send_response(200,"ok")
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header("Access-Control-Allow-Methods", "POST,GET,OPTIONS")
        self.send_header("Access-Control-Allow-Headers", "Authorization")
        self.send_header("Access-Control-Allow-Headers", "Content-Type")
        self.end_headers()
    

    现在它不会抛出任何错误,但不会对GET请求给出正确的响应。它只是在选项之后停止。请求和响应如下所示:

    请求标头:

    OPTIONS /GPIO/1/value HTTP/1.1
    Host: localhost:8000
    Connection: keep-alive
    Access-Control-Request-Method: GET
    Origin: http://192.168.1.108:51443
    User-Agent: Mozilla/5.0 (X11; Linux armv7l) AppleWebKit/537.36 (KHTML, like Gecko) Raspbian Chromium/65.0.3325.181 Chrome/65.0.3325.181 Safari/537.36
    Access-Control-Request-Headers: authorization
    Accept: */*
    Accept-Encoding: gzip, deflate, br
    Accept-Language: hu-HU,hu;q=0.9,en-US;q=0.8,en;q=0.7
    

    响应标题:

    HTTP/1.1 200 OK
    Date: Fri, 23 Nov 2018 22:06:28 GMT
    Server: WebIOPi/0.7.1/Python3.5
    Access-Control-Allow-Origin: *
    Access-Control-Allow-Methods: POST,GET,OPTIONS
    Access-Control-Allow-Origin: *
    Access-Control-Allow-Methods: GET,POST,OPTIONS
    Keep-Alive: timeout=5, max=100
    Connection: Keep-Alive
    Transfer-Encoding: chunked
    

    常规(从chrome网络选项卡):

    Request URL: http://localhost:8000/GPIO/1/value
    Request Method: OPTIONS
    Status Code: 200 OK
    Remote Address: [::1]:8000
    Referrer Policy: no-referrer-when-downgrade
    

    我的GET请求在哪里?为什么我只看到那些我根本就没有开始的选项?

    来自angular的请求:

    this.http.get<number>(this.route+'GPIO/'+gpio+'/value').subscribe(result => {
                    resolve(result);
                })
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Perrier    6 年前

    我必须启用http服务器的所有头:

    def do_OPTIONS(self):
        self.send_response(200,"ok")
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header("Access-Control-Allow-Methods", "*")
        self.send_header("Access-Control-Allow-Headers", "*")
        self.end_headers()