【问题标题】:Headers http are not delivered to my API标头 http 未传递到我的 API
【发布时间】:2017-06-12 10:48:59
【问题描述】:

我正在用 Go 开发一个 API,在 Angular(没有 AngularJS)中开发我的前端,但是当我在 Angular 中从我的 Web 应用程序调用我的 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 会导致问题。

【问题讨论】:

  • 这可能不相关,但您需要删除“授权”末尾的逗号:auth,

标签: angular http go


【解决方案1】:

代替

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()
         }
    }
}

【讨论】:

  • 谢谢兄弟,我的问题几乎解决了,现在我的授权标头设法在开头和结尾处得到一些标志,如下所示。我附上了邮递员的请求和网络应用程序的请求。 ANGULAR WEB APP Bearer "\"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTk2MTUyMTAsImlhdCI6MTQ5NzAyMzIxMCwibWFpbCI6InNlbGxlciJ9.nFV5JwB5lcN3e8CuMbNNx9Y6n1tW4oBT-5Eh8H5-YQ4\"" POSTMAN Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0OTkzODIzMjksImlhdCI6MTQ5Njc5MDMyOSwibWFpbCI6ImFkbWluIn0.v3GSiAIq6Bs5w3NPfjWT1kJF2Wv6zRrkSQY7hVDe7qQ
  • 什么意思?当前的问题究竟是什么?
  • 当我以角度构建我的标题授权时,我在终端中看到 Bearer ,但是当我在后端看到我的标题时(go)出现这个字符“\”,\“”,我没有继续:(
猜你喜欢
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
  • 2017-04-11
  • 2020-04-10
  • 2016-02-16
  • 2016-12-28
  • 1970-01-01
相关资源
最近更新 更多