Golang API服务无法接收Swagger API调用的解决方法

Golang API服务无法接收Swagger API调用的解决方法 我使用mux包创建的基础Golang API服务器遇到了一些问题。我尝试使用提供的SwaggerUI向我的本地主机(端口8080)发起调用,但似乎无法到达我的服务器。然而,通过Postman桌面应用程序使用相同的Curl命令,我却能够成功访问并与服务器通信。我已经尝试为服务器添加CORS支持,并使用了不同的允许Swagger的Golang命令,但都没有效果(无论是否包含CORS代码)。

我不确定问题是否出在我的防火墙或杀毒软件上,尽管即使我关闭了这两者,我似乎仍然无法通过SwaggerUI工具访问我的服务器。

对于如何解决这个问题,有什么想法或建议吗?

server := mux.NewRouter()
server.HandleFunc("/api/people/", addPerson).Methods("POST")

headersOk := handlers.AllowedHeaders([]string{"Access-Control-Allow-Headers",
    "Accept", "X-Requested-With"})
originsOk := handlers.AllowedOrigins([]string{os.Getenv("ORIGIN_ALLOWED")})
methodsOk := handlers.AllowedMethods([]string{"GET", "DELETE", "POST", "PUT", "PATCH"})
http.Handle("/", server)

log.Fatal(http.ListenAndServe(":8080", handlers.CORS(originsOk, headersOk, methodsOk)(server)))

更多关于Golang API服务无法接收Swagger API调用的解决方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang API服务无法接收Swagger API调用的解决方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


从你的代码来看,问题可能出在CORS配置和路由处理上。Swagger UI通常从浏览器发起请求,这涉及到预检请求(OPTIONS方法)和特定的头部要求。以下是需要修正的关键点:

  1. CORS头部不完整:缺少Content-TypeAuthorization等常用头部
  2. 路由处理顺序http.Handle("/", server)这行代码创建了额外的路由处理器
  3. OPTIONS方法支持:Swagger UI会发送OPTIONS预检请求

这是修正后的代码:

package main

import (
    "log"
    "net/http"
    "os"
    
    "github.com/gorilla/handlers"
    "github.com/gorilla/mux"
)

func addPerson(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    w.Write([]byte(`{"message": "Person added"}`))
}

func main() {
    server := mux.NewRouter()
    
    // 明确处理OPTIONS方法
    server.Methods("OPTIONS").HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
    })
    
    server.HandleFunc("/api/people/", addPerson).Methods("POST", "OPTIONS")
    
    // 完整的CORS配置
    headersOk := handlers.AllowedHeaders([]string{
        "X-Requested-With",
        "Content-Type",
        "Authorization",
        "Accept",
        "Origin",
        "Access-Control-Allow-Headers",
        "Access-Control-Request-Method",
        "Access-Control-Request-Headers",
    })
    
    originsOk := handlers.AllowedOrigins([]string{"*"}) // 开发环境可以用*,生产环境要指定具体域名
    methodsOk := handlers.AllowedMethods([]string{"GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"})
    
    // 启用CORS中间件
    corsHandler := handlers.CORS(headersOk, originsOk, methodsOk)(server)
    
    log.Println("Server starting on :8080")
    log.Fatal(http.ListenAndServe(":8080", corsHandler))
}

如果问题仍然存在,添加一个简单的健康检查端点来测试基本连接:

func healthCheck(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    w.Write([]byte(`{"status": "ok"}`))
}

// 在main函数中添加
server.HandleFunc("/health", healthCheck).Methods("GET")

然后通过浏览器直接访问 http://localhost:8080/health 来验证服务器是否响应。如果这个能工作但Swagger UI不能,问题可能出在Swagger UI的配置上。检查Swagger UI是否配置了正确的服务器URL,并且确保Swagger UI页面和API服务器在同一个端口或正确处理了跨域请求。

回到顶部