javascript - 使用自定义 header 获取请求失败

标签 javascript angularjs cross-browser go cors

这是我的 AngularJS 代码,(如果我删除标题选项,它工作正常)。

$http.get(env.apiURL()+'/banks', {
    headers: {
        'Authorization': 'Bearer '+localStorageService.get('access_token')
    }
})

请求如下:

OPTIONS /banks HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: http://localhost:8081
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36
Access-Control-Request-Headers: accept, authorization
Accept: */*
Referer: http://localhost:8081/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8,vi;q=0.6

和响应:

HTTP/1.1 404 Not Found
Access-Control-Allow-Headers: Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization
Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, DELETE
Access-Control-Allow-Origin: http://localhost:8081
Content-Type: text/plain; charset=utf-8
Date: Mon, 17 Mar 2014 11:05:20 GMT
Content-Length: 19

我添加了 AcceptAuthorization header ,但请求仍然失败?
大写(我的意思是 authorizationAuthorization)会导致失败吗?如果是,我怎样才能让 AngularJS 停止这样做?

if origin := req.Header.Get("Origin"); origin == "http://localhost:8081" {
    rw.Header().Set("Access-Control-Allow-Origin", origin)
    rw.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
    rw.Header().Set("Access-Control-Allow-Headers",
        "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
}

Go服务器路由代码:

r := mux.NewRouter()
r.HandleFunc("/banks", RetrieveAllBank).Methods("GET")

http.ListenAndServe(":8080", r)

最佳答案

好的,这个问题是因为我忘了处理“OPTIONS”请求(要使 CORS 浏览器首先发送预检 OPTIONS 请求,然后如果服务器接受了“真实”请求)。
我只需要修改我的 Go 服务器(见评论):

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/banks", RetrieveAllBank).Methods("GET")
    http.ListenAndServe(":8080", &MyServer{r})
}

type MyServer struct {
    r *mux.Router
}

func (s *IMoneyServer) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
    if origin := req.Header.Get("Origin"); origin == "http://localhost:8081" {
        rw.Header().Set("Access-Control-Allow-Origin", origin)
        rw.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
        rw.Header().Set("Access-Control-Allow-Headers",
            "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
    }
    // Stop here if its Preflighted OPTIONS request
    if req.Method == "OPTIONS" {
        return
    }
    // Lets Gorilla work
    s.r.ServeHTTP(rw, req)
}

关于javascript - 使用自定义 header 获取请求失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22452804/

相关文章:

javascript - Electron 自定义关闭、最大化和最大化不起作用

javascript - 异步等待内部如何工作?

ruby-on-rails-3.2 - AngularJS 中的嵌套模型

css - 跨浏览器 css 规则 : Mozila, chrome、safari 和 css2 与 css3

fonts - css 行高在 IE、Safari 和 Chrome 中呈现不同

javascript - 将具有相同类的所有 div 插入数组?

javascript - "matrix"VML 的属性在 IE8 中不起作用

javascript - 在 Visual Studio 中的另一个 javascript 中添加 AngularJS.min.js 的引用

javascript - 当您在 Angular ui-router 中处于相同状态时重新加载状态

javascript - 方向为 rtl 时的 jQuery.scrollLeft() - 不同浏览器中的不同值