标头http未发送到我的API

时间:2017-06-12 02:22:32

标签: angular http go

我正在Go中开发一个API restful和Angular中的前端(没有AngularJS),但是当我从Angular的Web App调用我的API时,我的后端没有看到我的标题,特殊情况下我的授权标题,因为我的API具有基于JWT的身份验证。

另外我想提一下,我正在使用Postman和Go Request客户端测试我的应用程序,我的标题在我的API中提供没有问题。

下面是我的后端的CORS和我前端的API调用。

我的后端:

func Cors() gin.HandlerFunc {
    log.Println("CORS Middleware")
    return func(c *gin.Context) {
        c.Writer.Header().Add("Access-Control-Allow-Origin", "*")
        c.Next()
    }
}

我的前端:

getData() {

const auth = `Bearer ${this.token}`;

const headers = new Headers({
  'Access-Control-Allow-Origin': '*',
  'Accept': 'application/json',
  'Authorization': auth,
});

const options = new RequestOptions(headers);

console.log(headers); //Here I can see 

const products = this.http.get('localhost:8000/api/products', options )
                .subscribe((response: Response) => {
                  this.data = response.json();
                });
return products;
}

感谢和抱歉我的英语,我认为我的CORS会导致问题。

1 个答案:

答案 0 :(得分:0)

而不是

const options = new RequestOptions(headers);

执行:

const options = new RequestOptions({ headers: headers });

constructor for RequestOptions需要RequestOptionsArgs,而不是Headers

此外,您似乎还不太了解CORS。您并不需要从前端向后端发送任何标头(浏览器会在发现它是CORS请求时自动附加您需要的内容)。那些标题(Access-Control-Allow-Origin)应仅由服务器发送。

对于你的后端,这里有一个改进的建议(应该处理大多数情况):

func Cors() gin.HandlerFunc {
    log.Println("CORS Middleware")
    return func(c *gin.Context) {
        c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
        c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE")
        c.Writer.Header().Set("Access-Control-Allow-Headers", "Origin, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
        c.Writer.Header().Set("Access-Control-Expose-Headers", "Content-Length")
        c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
        c.Writer.Header().Set("Access-Control-Max-Age", "86400")
        // c.Writer.Header().Set("Content-Type", "application/json") // uncomment if needed

         if c.Request.Method == "OPTIONS" {
             fmt.Println("OPTIONS")
             c.AbortWithStatus(200)
         } else {
             c.Next()
         }
    }
}