即使 HTTP 服务器开始使用 Go 和 protobuf、SQL Server,请求也不会返回结果

即使 http 服务器开始使用 go 和 protobuf、sql server,请求也不会返回结果

问题内容

我正在尝试使用 Go、protobuf 和 SQL Server 作为我的数据库来创建 API 请求。我的 HTTP 服务器由curl 请求启动,返回代码:5

我的main.go代码

package mainimport (    "context"    "database/sql"    "encoding/json"    "fmt"    "log"    "net"    "net/http"    "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"    pb "github.com/myorg/nb_nb_nb/proto"    "google.golang.org/grpc"    "google.golang.org/grpc/credentials"    _ "google.golang.org/grpc/grpclog/glogger"    _ "github.com/denisenkom/go-mssqldb")type appServer struct {    pb.UnimplementedMyAppServiceServer    db *sql.DB}//mssqlconst (    dbserver = "windows.net"    port     = 1433    user     = "reader"    password = "mypassword"    database = "dbnm")const sqlQuery = `my query`func (s *appServer) ExecuteQuery(ctx context.Context, req *pb.QueryRequest) (*pb.QueryResponseList, error) {    log.Printf("received: Start Date - %v, End Date - %v", req.GetReportStartDate(), req.GetReportEndDate())    rows, err := s.db.Query(sqlQuery, req.ReportStartDate, req.ReportEndDate)    if err != nil {        log.Printf("Error executing query: %v", err)        return nil, fmt.Errorf("failed to execute query: %v", err)    }    defer rows.Close()    var results []*pb.QueryResponse    for rows.Next() {        var result pb.QueryResponse        err := rows.Scan(            //fields        )        if err != nil {            log.Printf("Error scanning rows: %v", err)            return nil, fmt.Errorf("failed to scan rows: %v", err)        }        results = append(results, &result)    }    return &pb.QueryResponseList{Responses: results}, nil}func connectDB() (*sql.DB, error) {    connectionString := fmt.Sprintf("server=%s;user id=%s;password=%s;port=%d;database=%s", dbserver, user, password, port, database)    db, err := sql.Open("mssql", connectionString)    if err != nil {        return nil, fmt.Errorf("failed to connect to the database: %v", err)    }    if err := db.Ping(); err != nil {        return nil, fmt.Errorf("database connection failed: %v", err)    }    fmt.Println("Database connection successful")    return db, nil}func main() {    defer func() {        if r := recover(); r != nil {            log.Println("Recovered from panic:", r)        }    }()    db, err := connectDB()    if err != nil {        log.Fatalf("Failed to connect to the database: %v", err)    }    defer db.Close()    log.Println("Starting gRPC server...")    lis, err := net.Listen("tcp", ":7777")    if err != nil {        log.Fatalf("TCP connection failed: %v", err)    } else {        log.Printf("gRPC Server Listening at %v", lis.Addr())    }    size := 1024 * 1024 * 50    s := grpc.NewServer(grpc.MaxRecvMsgSize(size), grpc.MaxSendMsgSize(size))    pb.RegisterMyAppServiceServer(s, &appServer{db: db})    mux := runtime.NewServeMux()    opts := []grpc.DialOption{grpc.WithTransportCredentials(credentials.NewClientTLSFromCert(nil, ""))}    err = pb.RegisterMyAppServiceHandlerFromEndpoint(context.Background(), mux, ":7777", opts)    if err != nil {        log.Fatalf("Failed to register gRPC gateway: %v", err)    } else {        log.Printf("Registered gRPC gateway")    }    http.HandleFunc("/api/query", func(w http.ResponseWriter, r *http.Request) {        startDate := r.URL.Query().Get("startDate")        endDate := r.URL.Query().Get("endDate")        req := &pb.QueryRequest{            ReportStartDate: startDate,            ReportEndDate:   endDate,        }        fmt.Print(req)        resp, err := (&appServer{db: db}).ExecuteQuery(r.Context(), req)        if err != nil {            log.Printf("Error executing query: %v", err)            http.Error(w, "Internal Server Error", http.StatusInternalServerError)            return        }        w.Header().Set("Content-Type", "application/json")        json.NewEncoder(w).Encode(resp.Responses)    })    go func() {        log.Println("Starting HTTP server...")        err := http.ListenAndServe(":7778", mux)        if err != nil {            log.Fatalf("HTTP server failed: %v", err)        } else {            log.Printf("HTTP server started.")        }    }()    if err := s.Serve(lis); err != nil {        log.Fatalf("gRPC server failed: %v", err)    } else {        log.Printf("gRPC, HTTP, and API server started.")    }}

登录后复制

go运行server/main.go返回

Database connection successful2023/12/24 21:48:23 Starting gRPC server...2023/12/24 21:48:23 gRPC Server Listening at [::]:77772023/12/24 21:48:23 Registered gRPC gateway2023/12/24 21:48:23 Starting HTTP server...

登录后复制

和curl请求(curl -X GET “http://localhost:7778/api/query?startDate=2023-10-01&endDate=2023-10-02”)返回:

{"code":5, "message":"Not Found", "details":[]}

登录后复制

我的代码中缺少什么?为什么我无法返回任何结果?我的防火墙已关闭。

正确答案

看起来路由“/api/query”已经定义在默认的ServeMux上,但是在监听接口时使用了mux ServeMux。

以上就是即使 HTTP 服务器开始使用 Go 和 protobuf、SQL Server,请求也不会返回结果的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2485729.html

(0)
上一篇 2025年3月4日 21:50:09
下一篇 2025年2月25日 08:48:30

AD推荐 黄金广告位招租... 更多推荐

相关推荐

发表回复

登录后才能评论