GO后端 | RESful API
GO写的 RESful API1.简单的GO Web创建请求apihttp.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {_, _ = fmt.Fprintln(writer, "Android服务后台,%q", html.EscapeString(request.URL.Path)...
GO写的 RESful API
1.简单的GO Web
-
创建请求api
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)
-
创建handler函数
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
-
添加handle处理函数
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.部署运行程序
-
go多平台打包
https://blog.csdn.net/jinjianghai/article/details/85293380
-
后台运行
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());
}
});
结果输出
《GO RESful API (二)》, 一起来围观吧 https://blog.csdn.net/printf123scanf/article/details/104663921?utm_source=app
更多推荐
所有评论(0)