发布
社区首页 >问答首页 >如何让OPTIONS方法从移动使用大猩猩处理程序?

如何让OPTIONS方法从移动使用大猩猩处理程序?
EN

Stack Overflow用户
提问于 2016-07-14 21:57:19
回答 2查看 2.6K关注 0票数 2

需要接受来自移动设备的OPTIONS方法,尝试了多种方式,但得到了奇怪的行为:

当我尝试这样做时,我从客户端得到了403:(客户端在POST之前发送OPTIONS )

代码语言:javascript
代码运行次数:0
复制
  import (
    "net/http"

    "github.com/gorilla/handlers"
    "github.com/gorilla/mux"
)

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/users", UserEndpoint)
    r.HandleFunc("/projects", ProjectEndpoint)

    methods := handlers.AllowedMethods([]string{"OPTIONS", "DELETE", "GET", "HEAD", "POST"}

    http.ListenAndServe(":8000", handlers.CORS(methods)(r))
}

如果我省略methods

代码语言:javascript
代码运行次数:0
复制
        http.ListenAndServe(":8000", handlers.CORS()(r))

我得到的是403未授权

还使用了它,删除了GET方法:

代码语言:javascript
代码运行次数:0
复制
methods := handlers.AllowedMethods([]string{"OPTIONS"}

http.ListenAndServe(":8000", handlers.CORS(methods)(r))

但在浏览器(chromes DHC)中从rest客户端尝试时仍然可以获得200 GET

但如果我删除OPTIONS

代码语言:javascript
代码运行次数:0
复制
methods := handlers.AllowedMethods([]string{"DELETE", "GET", "HEAD", "POST"}

http.ListenAndServe(":8000", handlers.CORS(methods)(r))

我得到405

第一个示例基于gorilla处理程序文档。

对这个问题有什么想法吗?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2017-03-14 05:16:22

你真的需要了解正在发出的请求,但我遇到了类似的问题,并通过以下方法解决了它:

代码语言:javascript
代码运行次数:0
复制
handlers.CORS(
        handlers.AllowedOrigins([]string{"*"}),
        handlers.AllowedMethods([]string{"POST"}),
        handlers.AllowedHeaders([]string{"Content-Type", "X-Requested-With"}),
    )(router)

我需要发出的请求(模拟印前检查)是:

代码语言:javascript
代码运行次数:0
复制
curl -H "Origin: http://example.com" \
-H "Access-Control-Request-Method: POST" \
-H "Access-Control-Request-Headers: X-Requested-With" \
-X OPTIONS --verbose http://127.0.0.1:8080/products

这实际上是AllowedHeaders函数造成了所有的不同。一旦我添加了它,403错误就消失了。

票数 3
EN

Stack Overflow用户

发布于 2016-07-15 00:23:39

如果你注意到cors.go选项是经过特殊处理的:

代码语言:javascript
代码运行次数:0
复制
corsOptionMethod           string = "OPTIONS"
...

    if r.Method == corsOptionMethod {
        if ch.ignoreOptions {
            ch.h.ServeHTTP(w, r)
            return
        }

        if _, ok := r.Header[corsRequestMethodHeader]; !ok {
            w.WriteHeader(http.StatusBadRequest)
            return
        }

        method := r.Header.Get(corsRequestMethodHeader)
        if !ch.isMatch(method, ch.allowedMethods) {
            w.WriteHeader(http.StatusMethodNotAllowed)
            return
        }
...

所以405是http.StatusMethodNotAllowed,所以它可能不是CORs请求头?

还有一种用于独立处理选项的IngoreOptions方法:http://www.gorillatoolkit.org/pkg/handlers#IgnoreOptions --这可能适用于您的情况,您可以忽略它,或者自己处理选项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38376226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档