GO后端 | RESful API
原创
©著作权归作者所有:来自51CTO博客作者wx63637f8e01d6a的原创作品,请联系作者获取转载授权,否则将追究法律责任
GO写的 RESful API
1.简单的GO Web
http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
_, _ = fmt.Fprintln(writer, "Android服务后台,%q", html.EscapeString(request.URL.Path))
})
log.Fatal(http.ListenAndServe(":8080",router))
-
http.HandleFun(path,fun(write,request))
创建handle处理函数 -
fmt.Fprintln
输出到网页 -
http.ListenAndServer(url,nil)
监听端口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gca1nBYi-1583212882838)(C:\Users\Primer4\Documents\学习笔记\1583152716793.png)]
2.使用mux路由
- 导包
"github.com/gorilla/mux"
import - 步骤
- 创建router路由
router:=mux.NewRouter().StrictSlash(true)
- 添加handler处理函数
router.HandleFunc("/index",IndexHandle)
func IndexHandle(writer http.ResponseWriter, request *http.Request) {
_, _ = fmt.Fprintln(writer, "mux路由器")
}
- 监听服务器
http.ListenAndServe(":8080",router)
3.添加更多路由
- 当前handler继续添加
router.HandleFunc("/name",NameHandle)
- 添加可选的{}
router.HandleFunc("/name/{id}",NameByIdHandle)
func NameByIdHandle(writer http.ResponseWriter, request *http.Request) {
vars:=mux.Vars(request)
val:=vars["id"]
_, _ = fmt.Fprintln(writer, vars)
_, _ = fmt.Fprintln(writer, val)
}
4.创建模型
- 创建模型
json标签,指定json key的值,避免冲突
//user结构体
type User struct {
Id int `json:"id"`
Name string `json:"name"`
CreateTime string `json:"create_time"`
}
//别名
type Users []User
func UserHandle(writer http.ResponseWriter, request *http.Request) {
user:=modle.User{
Id:24,
Name:"Git",
CreateTime:time.Unix(time.Now().Unix(),0).Format("2006-01-02 03:04:05 PM"),
}
jsonStr := json.NewEncoder(writer).Encode(user)
_, _ = fmt.Fprintln(writer, jsonStr)
}
5.重构代码 & 添加网络日志
func MyLog(inner http.Handler,msg string)http.Handler{
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
inner.ServeHTTP(w, r)
log.Printf(
"%s\t%s\t%s\t%s",
r.Method,
r.RequestURI,
msg,
time.Since(start),
)
})
}
// 1.创建自定义路由
type CustomRoute struct {
Name string
Method string
Path string
HandlerFunc http.HandlerFunc
}
type Routes []CustomRoute
// 2.路由数组管理
var routers = Routes{
CustomRoute{
"IndexHandle",
"GET",
"/index",
IndexHandle,
},
CustomRoute{
"NameHandle",
"GET",
"/name",
NameHandle,
},
CustomRoute{
"NameByIdHandle",
"GET",
"/name/{id}",
NameByIdHandle,
},
CustomRoute{
"UserHandle",
"GET",
"/users",
UserHandle,
},
}
// 3.根据集合创建 路由
func NewRouter()* mux.Router{
route := mux.NewRouter().StrictSlash(true)
var handle http.Handler
for _,r := range routers{
// 4.添加日志
handle = r.HandlerFunc
handle = mylog.MyLog(handle,r.Name)
route.Methods(r.Method).Path(r.Path).Name(r.Name).Handler(handle)
}
return route
}
func main() {
// 5.创建路由
routers:=NewRouter()
log.Fatal(http.ListenAndServe(":8080",routers))
}
6.部署运行程序
- 后台运行
chmod 777
./程序名 &
遇到的Linux问题
- 杀死后台进程
kill -9 pid
- 查看端口占用情况
lsof -i:8080
- 后台运行
nohub ./程序名 &
<关闭终端也会继续运行> - 查看所有正在运行的Linux进程信息
ps -aux
Android遇到问题
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path $
解决
接受的返回值改为数组
7.基于Android Retrofit网络请求example
public interface UserService {
//http://xxx:8081/users
@GET("users")
Call<List<UserDao>> getUsers();
}
Retrofit userRetrogit;
userRetrogit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("http://xxxxxx:8081/")
.build();
userService = userRetrogit.create(UserService.class);
Call<List<UserDao>> users = userService.getUsers();
users.enqueue(new Callback<List<UserDao>>() {
@Override
public void onResponse(Call<List<UserDao>> call, Response<List<UserDao>> response) {
Log.d(TAG, "onResponse: "+response.body().size());
List<UserDao> body = response.body();
for(UserDao i:body){
Log.d(TAG, "onResponse: "+i.toString());
}
}
@Override
public void onFailure(Call<List<UserDao>> call, Throwable t) {
Log.d(TAG, "onFailure: 失败users");
Log.d(TAG, "onFailure: 失败原因\n"+t.toString());
}
});
结果输出