Javascript fetch() 不止一次 ping 我的 golang 休息端点?

标签 javascript go cors

我有一个错误,我不明白是我对 Golang 做错了什么,还是我对 javascript fetch() 语句做错了什么。这是一个简单的情况,我想对 golang 端点进行 fetch() 调用并简单地打印 hello world。但出于某种原因,golang 代码触发了两次。这是我的代码:

// main.go

package main

import (

  "route/page"
  "github.com/gorilla/mux"
  "log"
  "net/http"
)

func main() {

    router := mux.NewRouter()
    router.HandleFunc("/page", page.Search).Methods("GET","OPTIONS")
    log.Fatal(http.ListenAndServe(":8000", router))

}


//route/page.go

package page
import (
  "net/http"
  "log"
)

func Search(w http.ResponseWriter, r *http.Request) {

  w.Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, Authorization, Organization")
  w.Header().Set("Access-Control-Allow-Origin", "*")
  w.Header().Set("Content-Type", "application/json")

  log.Println(r.Header.Get("authorization"))

  log.Println("Hello World")
  w.Write([]byte("{}"))
  return
}

然后我转到 JSFiddle.net 并粘贴以下 JS 代码并按下运行:

fetch('http://192.168.0.21:8000/page', {
  method: 'GET',
  headers: {
    'Content-Type': 'text/plain',
    'Organization': 'afae3@@@@@%2Fajfoij',
    'Authorization': 'Basic tajoie#$@asdfall%DF;++JI%2F3255',
  }
})

出于某种原因,我的控制台像这样打印两次 Hello World:

john@ubuntu:~/go/src/myproject$ go run main.go
2018/09/20 18:42:29
2018/09/20 18:42:29 Hello World
2018/09/20 18:42:29 Basic tajoie#$@asdfall%DF;++JI%2F3255
2018/09/20 18:42:29 Hello World

我将我的 JS 代码转录成 PHP,将我的 PHP 代码放在与我的 golang 代码相同的本地主机上,从控制台运行 PHP 代码,并获得了 golang 代码仅执行一次的预期结果。有谁知道发生了什么事?我对 fetch() 有什么误解吗?我设置 header 的方式是否有异常?

最佳答案

router.HandleFunc("/page", page.Search).Methods("GET","OPTIONS")

告诉路由器将 GET 和OPTIONS 方法定向到搜索处理程序。

CORS 预检通常由单独的处理程序处理。在您的例子中,您告诉 Go 使用搜索处理程序处理飞行前检查和获取请求。

通常,您希望将飞行前检查与后续请求分开处理,因此请求不会执行两次(一次无缘无故。)

飞行前处理程序的一个极其简单的版本是:

func PreFlightHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Access-Control-Allow-Origin", "http://localhost")
    w.Header().Set("Vary", "Origin")
    w.Header().Set("Vary", "Access-Control-Request-Method")
    w.Header().Set("Vary", "Access-Control-Request-Headers")
    w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Origin, Accept")
    w.Header().Set("Access-Control-Allow-Methods", "GET,POST,OPTIONS")
    w.Header().Set("Access-Control-Allow-Credentials", "true")
}

完整的 Golang 代码是:

// main.go

package main

import (

  "route/page"
  "github.com/gorilla/mux"
  "log"
  "net/http"
)

func main() {

    router := mux.NewRouter()
    router.HandleFunc("/page", page.PreFlightHandler).Methods("OPTIONS")

    router.HandleFunc("/page", page.Search).Methods("GET")

    log.Fatal(http.ListenAndServe(":8000", router))

}

// route/page.go
package page
import (
  "net/http"
  "log"
)

func PreFlightHandler(w http.ResponseWriter, r *http.Request) {

    w.Header().Set("Access-Control-Allow-Origin", "*")
    w.Header().Set("Vary", "Origin")
    w.Header().Set("Vary", "Access-Control-Request-Method")
    w.Header().Set("Vary", "Access-Control-Request-Headers")
    w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Origin, Accept, Authorization, Organization")
    w.Header().Set("Access-Control-Allow-Methods", "GET,POST,OPTIONS")
    w.Header().Set("Access-Control-Allow-Credentials", "true")
}
func Search(w http.ResponseWriter, r *http.Request) {

  log.Println(r.Header.Get("authorization"))

  log.Println("Hello World")
  w.Write([]byte("{}"))
  return
}

关于Javascript fetch() 不止一次 ping 我的 golang 休息端点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52434349/

相关文章:

javascript - 为什么在使用 || 时返回两个值而不是一个值在返回声明中?

javascript - "for"开头的分号是如何工作的?

go - 无法分配给 map 中的结构字段

javascript - jquery自动按钮点击问题

javascript - 我有 contenteditable div ,里面是一个不可编辑的跨度,如何通过跨度文本长按来标记 div 的文本

postgresql - Golang 将一片结构作为用户定义类型的数组传递给存储过程

go - 如何将以毫秒为单位的字符串时间(hh :mm:ss. xxx)转换为time.Time?

node.js - 如何从React客户端向Heroku平台上运行的Express服务器发出API请求

node.js - 使用 Fetch API 重新调整的 POST 请求不起作用

cors - 浏览器丢弃了 HTTP 302 重定向到 CORS 请求