Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用自定义标头获取请求失败_Javascript_Angularjs_Cross Browser_Go_Cors - Fatal编程技术网

Javascript 使用自定义标头获取请求失败

Javascript 使用自定义标头获取请求失败,javascript,angularjs,cross-browser,go,cors,Javascript,Angularjs,Cross Browser,Go,Cors,这是我的AngularJS代码(如果我删除header选项,它可以正常工作) $http.get(env.apirl()+'/banks'{ 标题:{ 'Authorization':'Bearer'+localStorageService.get('access\u token') } }) 请求如下: OPTIONS /banks HTTP/1.1 Host: localhost:8080 Connection: keep-alive Access-Control-Request-Meth

这是我的AngularJS代码(如果我删除header选项,它可以正常工作)

$http.get(env.apirl()+'/banks'{
标题:{
'Authorization':'Bearer'+localStorageService.get('access\u 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
我添加了
Accept
Authorization
头,但请求仍然失败?
大写字母(我指的是
授权
授权
)是否会导致失败?如果是,我如何才能让AngularJS停止这样做

if origin:=req.Header.Get(“origin”);原点==”http://localhost:8081" {
rw.Header().Set(“访问控制允许原点”,原点)
rw.Header().Set(“访问控制允许方法”、“POST、GET、OPTIONS、PUT、DELETE”)
rw.Header().Set(“访问控制允许标头”,
“接受,内容类型,内容长度,接受编码,X-CSRF-Token,授权”)
}
Go服务器路由代码:

r:=mux.NewRouter()
r、 HandleFunc(“/banks”,RetrieveAllBank).Methods(“GET”)
http.listendServe(“:8080”,r)

好的,这个问题是因为我需要处理“选项”请求(要使CORS浏览器先发送飞行前选项请求,然后发送“真实”请求(如果服务器接受)。
我只需要修改我的Go服务器(请参见注释):


尝试在go中共享您的Rouning代码,因为您收到的是404 Not FoundOK,我已经添加了路由代码。你认为我应该在路由器中启用“选项”吗?是否有中间件试图处理授权头?我尝试了你的代码(没有AngularJS),它工作正常。也许你的原始标题不正确。不,我只是发送给你修改过的!你怎么能测试呢?啊,好吧,问题是“选项”方法没有处理程序。谢谢你的时间:)我只是想说,谢谢你发布这个答案,我在不久前把它作为一个答案添加了,因为除了这一个,其他人都失败了,人们更可能通过谷歌遇到那个帖子。很高兴我能帮上忙:)我在NodeJS中以类似的方式解决了这个问题,基本上就是跳出了Auth过滤器。这有点骇人听闻,但我认为需要这样做,这取决于浏览器中选项的工作方式。
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)
}