golang http.FileServer 遇到的坑

本文介绍了一位开发者遇到的Go语言HTTP服务器返回404错误的问题及解决方案。通过使用`http.StripPrefix`方法成功解决了静态文件无法正常访问的情况。

上次写了一个2行实现一个静态服务器的 文章

今天群里有个哥们是这么写居然返回的是404 见鬼了嘛??


   http.handle("/js",  http.FileServer(http.Dir("js"))

   http.ListenAndServe("8080", nil)
大概的意思就是绑定 路由为 js 的时候访问这个js 文件夹  看了一下确实代码上面没什么毛病。但是路径怎么修改 也不好使。
我把代码拿到我的 电脑上面运行 shitfuck 这是搞什么啊居然出现下面的这个情况

奇怪居然在我电脑上面也不能执行了。莫非我的文件夹权限有问题

给赋值一下 777 权限 重新运行 

居然还不好使。来回改路径 就这么捣鼓了两个小时无意中看到一个文章就是说的这个

加一个StripPrefix 方法就好了

那这个玩意是干嘛的呢。看看手册

然后我的代码就变成这个样子

   http.Handle("/js/", http.StripPrefix("/js/", http.FileServer(http.Dir("js"))))

http.StripPrefix用于过滤request,参数里的handler的request过滤掉特定的前序,只有这样,才能正确显示文件目录。 shitfuck
看一下我的路径 以及下面存放的文件

修改代码完成后就这么神奇般的解决了

浪费了两个小时不过 还不错最起码解决问题了。 

我还能说什么 书读的少就是不好


--------------------- 
作者:一名路过的小码农 
来源:优快云 
原文:https://blog.youkuaiyun.com/liangguangchuan/article/details/60326495 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

 

 http.Handle("/js/", http.StripPrefix("/js/", http.FileServer(http.Dir("js"))))
                      输出url                          输出url                                      目录地址

gohttp是一个http的文件服务器,因为是用go语言写的,所以加了一个go的抬头。之所以用go是因为发布起来是一个二进制文件,不同的平台都可以用,而且没有依赖问题,且稳定性也很好。    这个软件从很久以前就开始写了,第一次提交实在2015年的2月11号,作为组内存放公共文件的一个小软件。一开始的功能只有像 python -mSimpleHTTPServer 那种简单的功能。但是当我看到gotty这个软件的时候 ,意思到一个简单的软件竟然可以做到如此出色。之后这个http文件服务器就不断的被优化着,保持着简单易用的同时,开始赋予了它最强大的功能。    这个软件有很多的技术,隐藏在了其简易朴实的外表之下。请容我简单的介绍下pjax简称页面ajax技术        在gohttp进行目录却换的时候,你会看到地址栏在变,但是页面却是局部刷新的。各种文件的预览功能        所有常见的代码都可以直接在gohttp下预览,如果你用的是chrome浏览器的话,包括pdf,mp4,mp3都可以直接预览。实时的目录zip打包下载        强大的体现在它是实时的,即使你马上在目录下新增了一个文件,点击目录zip下载的时候,这个文件也会出现在里面。二维码的支持        手机下载往往没有电脑下载这么容易,点点鼠标就可以了。但是有了二维码,手机也只用扫一扫就可以下载了。苹果应用的在线安装        iphone应用安装包的扩展名是ipa,但是你还必须有个额外的plist文件才行。以及生成一个itms-services开头的地址,gohttp直接把这些工作都做了,ipa的解析,plist以及下载页面的自动生成。同普通文件一样,只需要点击右侧的生成二维码,然后用iphone手机扫描下,iphone的应用就安装到了你的手机上。PS:爹的苹果,就不能像安卓一样简单一点吗README文件的自动显示像github网站上的项目,readme文件都会作为项目的介绍自动显示出来。gohttp也借鉴了一下。如果目录下有readme文件的话,就会自动预览出来。文件上传简单的文件上传也有着出色的表现,可以看到上传的进度,以及支持拖拽的方式上传文件。为了更方便的结合自动发布的功能,文件上传也有其相应的API,上传的时候也可是指定软件的版本号,存储结构参考了python,pypi官方的模式。还有很多很多其他的特性    http basic auth认证,不同文件不同的icon,gzip支持,目录的整合显示.... 还有很多功能等待着你去发现和有能力的你去补充。    截图  标签:gohttp
<think>好的,我现在需要帮助用户了解如何用Golang实现MCP协议的服务器端和客户端开发。首先,我需要回顾一下用户提供的引用内容,特别是关于MCP协议的信息。根据引用[1],MCP是一种开放协议,用于让AI模型安全地与本地和远程资源交互。用户还提到了gRPC的相关内容,引用[2]和[3]讨论了gRPC的使用,这可能和MCP的实现有关,因为gRPC常用于服务间的通信。此外,引用[4]提到Virtual Kubelet,但暂时可能不相关。 用户的问题是关于用Golang开发MCP服务器和客户端的方法及示例代码。首先,我需要确认MCP的具体协议定义,但用户提供的引用中没有详细的协议规范。通常,实现协议需要根据其接口定义,比如使用Protocol Buffers(protobuf)定义服务和方法,然后生成代码。引用[3]中的例子展示了如何用protobuf定义服务,这可能是一个参考。 由于MCP可能类似于gRPC,我可以假设使用gRPC框架来实现。根据引用[2],gRPC是跨语言的RPC系统,适合实现这样的协议。因此,步骤可能包括定义protobuf文件、生成Go代码、实现服务器和客户端逻辑。 需要检查用户提供的引用中是否有MCP的具体服务定义,但引用[1]只提到MCP的用途,没有详细的方法或接口。因此,可能需要假设或参考类似协议的结构。例如,假设MCP需要文件访问和数据库连接,可以定义相应的RPC方法,如ReadFile、QuerySQL等。 接下来,我需要构建一个示例流程。首先,定义.proto文件,指定服务和方法。然后使用protoc生成Go代码。接着,实现服务器端的方法,比如处理请求并访问资源。客户端部分则需要调用这些方法。 可能遇到的问题包括服务端未实现所有RPC方法,如引用[3]中提到的错误。因此,在示例代码中需要确保服务器正确实现了所有定义的方法。同时,需要注意错误处理和安全性,如引用[1]提到的安全交互。 总结步骤:1. 定义protobuf服务;2. 生成Go代码;3. 实现服务器逻辑;4. 编写客户端调用代码。还需要考虑依赖管理,如导入必要的gRPC库。 最后,要确保回答结构清晰,符合用户要求,提供示例代码和相关问题。同时,引用正确的来源,如引用[1]关于MCP的概述和引用[2]、[3]关于gRPC的实现。</think>以下是使用Golang开发MCP协议服务器端和客户端的实现方法及示例代码: ### 一、开发准备 1. 安装Protocol Buffers编译器(protoc) 2. 安装Go语言插件: ```bash go install google.golang.org/protobuf/cmd/protoc-gen-go@latest go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest ``` 3. 创建协议文件`mcp.proto`: ```protobuf syntax = "proto3"; option go_package = "./mcp"; service ContextService { rpc ReadFile(FileRequest) returns (FileResponse) {} rpc QuerySQL(SQLRequest) returns (SQLResponse) {} } message FileRequest { string filepath = 1; } message FileResponse { bytes content = 1; } message SQLRequest { string query = 1; } message SQLResponse { repeated string results = 1; } ``` ### 二、服务器端实现 ```go package main import ( "context" "log" "net" "google.golang.org/grpc" pb "path/to/mcp" ) type server struct { pb.UnimplementedContextServiceServer } func (s *server) ReadFile(ctx context.Context, req *pb.FileRequest) (*pb.FileResponse, error) { // 实现文件读取逻辑 content := []byte("示例文件内容") return &pb.FileResponse{Content: content}, nil } func (s *server) QuerySQL(ctx context.Context, req *pb.SQLRequest) (*pb.SQLResponse, error) { // 实现数据库查询逻辑 return &pb.SQLResponse{Results: []string{"记录1", "记录2"}}, nil } func main() { lis, _ := net.Listen("tcp", ":50051") s := grpc.NewServer() pb.RegisterContextServiceServer(s, &server{}) s.Serve(lis) } ``` ### 三、客户端实现 ```go package main import ( "context" "log" "google.golang.org/grpc" pb "path/to/mcp" ) func main() { conn, _ := grpc.Dial("localhost:50051", grpc.WithInsecure()) defer conn.Close() client := pb.NewContextServiceClient(conn) // 文件操作示例 fileRes, _ := client.ReadFile(context.Background(), &pb.FileRequest{Filepath: "/data/test.txt"}) log.Printf("文件内容: %s", fileRes.Content) // 数据库操作示例 sqlRes, _ := client.QuerySQL(context.Background(), &pb.SQLRequest{Query: "SELECT * FROM users"}) log.Printf("查询结果: %v", sqlRes.Results) } ``` ### 四、关键实现要点 1. 协议定义:使用protobuf3定义服务接口和消息格式[^2] 2. 服务注册:通过grpc.NewServer()创建服务实例并注册实现类[^3] 3. 安全通信:生产环境应添加TLS加密和身份验证 4. 错误处理:需要实现完善的错误码和异常处理机制 5. 性能优化:可结合连接池和流式传输提升效率
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值