185 lines
3.9 KiB
Markdown
185 lines
3.9 KiB
Markdown
# Gosh
|
||
|
||
Gosh 是一个轻量级的 HTTP 服务器类库,允许用户通过注册 [Anko](https://github.com/mattn/anko) 脚本和 Go 函数来快速构建 RESTful API。
|
||
|
||
## 特性
|
||
|
||
- 简单易用的 HTTP 路由注册
|
||
- 支持 GET、POST、PUT、DELETE、PATCH 等 HTTP 方法
|
||
- 通过 Anko 脚本语言实现动态 API 处理
|
||
- 内置请求和响应辅助工具
|
||
- 支持文件系统、网络、进程和 Shell 命令操作
|
||
- 跨平台支持(Linux、Windows)
|
||
|
||
## 安装
|
||
|
||
```bash
|
||
go get git.kingecg.top/kingecg/gosh
|
||
```
|
||
|
||
## 快速开始
|
||
|
||
创建一个简单的 HTTP 服务器:
|
||
|
||
```go
|
||
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"net/http"
|
||
|
||
"git.kingecg.top/kingecg/gosh"
|
||
)
|
||
|
||
func main() {
|
||
// 创建服务器实例
|
||
serverMux := gosh.NewSHMux()
|
||
|
||
// 注册 Go 函数,可在脚本中调用
|
||
serverMux.RegistFunction("hello", func(name string) string {
|
||
return fmt.Sprintf("Hello, %s", name)
|
||
})
|
||
|
||
// 注册 GET 路由,使用 Anko 脚本处理请求
|
||
serverMux.GET("/hello", `
|
||
name = Req.GetQuery("name")
|
||
Res.WriteStr(hello(name))
|
||
`)
|
||
|
||
// 启动服务器
|
||
http.ListenAndServe(":8089", serverMux)
|
||
}
|
||
```
|
||
|
||
## API 参考
|
||
|
||
### 服务器创建
|
||
|
||
```go
|
||
// 创建新的服务器实例
|
||
serverMux := gosh.NewSHMux()
|
||
```
|
||
|
||
### 路由注册
|
||
|
||
```go
|
||
// 注册 HTTP 方法路由
|
||
serverMux.GET(pattern, script)
|
||
serverMux.POST(pattern, script)
|
||
serverMux.PUT(pattern, script)
|
||
serverMux.DELETE(pattern, script)
|
||
serverMux.PATCH(pattern, script)
|
||
```
|
||
|
||
### 函数注册
|
||
|
||
```go
|
||
// 注册 Go 函数,可在脚本中调用
|
||
serverMux.RegistFunction(name, function)
|
||
```
|
||
|
||
### 请求处理
|
||
|
||
在 Anko 脚本中,可以使用以下对象和方法:
|
||
|
||
- `Req` - 请求对象
|
||
- `Req.GetQuery(key)` - 获取查询参数
|
||
- `Req.GetBodyStr()` - 获取请求体字符串
|
||
- `Req.GetHeader(key)` - 获取请求头
|
||
- `Req.GetBody()` - 获取解析后的请求体(JSON 或表单)
|
||
|
||
- `Res` - 响应对象
|
||
- `Res.SetHeader(key, value)` - 设置响应头
|
||
- `Res.WriteStr(str)` - 写入字符串响应
|
||
- `Res.WriteJSON(value)` - 写入 JSON 响应
|
||
- `Res.Status(code)` - 设置状态码
|
||
- `Res.StatusOk()` - 设置 200 状态码
|
||
- `Res.StatusBadRequest()` - 设置 400 状态码
|
||
- `Res.StatusNotFound()` - 设置 404 状态码
|
||
- `Res.StatusInternalServerError()` - 设置 500 状态码
|
||
- `Res.StatusForbidden()` - 设置 403 状态码
|
||
|
||
### 内置模块
|
||
|
||
在 Anko 脚本中,可以使用 `Require` 函数导入以下模块:
|
||
|
||
- `fs` - 文件系统模块
|
||
- 提供文件读写操作
|
||
|
||
- `net` - 网络模块
|
||
- 提供网络相关操作,如端口检测
|
||
|
||
- `process` - 进程模块
|
||
- 提供进程信息和环境变量访问
|
||
- 获取和设置环境变量
|
||
- 获取进程 ID 和主机名等信息
|
||
|
||
- `shell` - Shell 命令模块
|
||
- 提供执行 Shell 命令的功能
|
||
- 支持 Linux bash、Windows cmd 和 PowerShell
|
||
- 命令输出解析功能
|
||
|
||
## 示例
|
||
|
||
### 处理 JSON 请求
|
||
|
||
```go
|
||
serverMux.POST("/api/user", `
|
||
body = Req.GetBody()
|
||
name = body["name"]
|
||
age = body["age"]
|
||
|
||
response = {
|
||
"message": "User created",
|
||
"user": {
|
||
"name": name,
|
||
"age": age
|
||
}
|
||
}
|
||
|
||
Res.WriteJSON(response)
|
||
`)
|
||
```
|
||
|
||
### 使用文件系统模块
|
||
|
||
```go
|
||
serverMux.GET("/api/file", `
|
||
fs = Require("fs")
|
||
content = fs.ReadFile("/path/to/file.txt", "utf8")
|
||
Res.WriteStr(content)
|
||
`)
|
||
```
|
||
|
||
### 使用进程模块
|
||
|
||
```go
|
||
serverMux.GET("/api/env", `
|
||
process = Require("process")
|
||
env = process.GetAllEnv()
|
||
Res.WriteJSON(env)
|
||
`)
|
||
```
|
||
|
||
### 使用 Shell 模块
|
||
|
||
```go
|
||
serverMux.GET("/api/ls", `
|
||
shell = Require("shell")
|
||
result, err = shell.Exec("ls -la")
|
||
if err == nil {
|
||
Res.WriteStr(result.Stdout)
|
||
} else {
|
||
Res.StatusInternalServerError()
|
||
Res.WriteStr("Error executing command")
|
||
}
|
||
`)
|
||
```
|
||
|
||
## 贡献
|
||
|
||
欢迎提交问题和拉取请求!
|
||
|
||
## 许可证
|
||
|
||
本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件。 |