RESTful架构搜集
今天才知道RESTful这个词,感觉好落后呀。自从5月份后很少学习新知识,这是个不好的信号。
RESTful是Representational State Transfer的缩写。怎么理解Representational State Transfer呢?
- 资源(Resources):
 
所谓资源,就是一个网络实体,或者说就是网络上的一个具体信息。它可以是一段音乐,一个图片,一首歌曲,一种服务,总之就是一个具体的存在。你可以使用URI(统一资源定位符)指向他们,每种资源都有一个特定的URI。要获取这个资源,只需访问这个URI就可以了。因此这个URI就成为一个独一无二的识别符。
- 表现层(Representation):
 
资源是一个信息实体,它可以有多种表现实体。我们把资源的具体呈现形式,称为表现层(Representation),例如:图片,txt, json等
URI只代表资源的实体,不代表它的形式。严格地说,有些网址最后的".html"后缀名是不必要的,因为这个后缀名表示格式,属于"表现层"范畴,而URI应该只代表"资源"的位置。它的具体表现形式,应该在HTTP请求的头信息中用Accept和Content-Type字段指定,这两个字段才是对"表现层"的描述。
- 状态转化(State Transfer)
 
访问一个网站,就代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。
互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。
客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源
以上引用:阮一峰 理解restful架构
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
经过3天研究发现restful很有意思,同时,我基本上填坑的,我是用go + PostgreSQL 语言写的,go我不是太会,PostgreSQL我从来没用过。本来是个很简单的玩意,硬是花了3天。go真心不好调试。
go RESTful 库:https://github.com/ant0ine/go-json-rest
go postgreSql driver: https://github.com/go-pg/pg
主要参考的就是这个例子:
package main import (
"fmt"
"github.com/ant0ine/go-json-rest/rest"
"log"
"net/http"
"sync"
) func main() { users := Users{
Store: map[string]*User{},
} api := rest.NewApi()
api.Use(rest.DefaultDevStack...)
router, err := rest.MakeRouter(
rest.Get("/users", users.GetAllUsers),
rest.Post("/users", users.PostUser),
rest.Get("/users/:id", users.GetUser),
rest.Put("/users/:id", users.PutUser),
rest.Delete("/users/:id", users.DeleteUser),
)
if err != nil {
log.Fatal(err)
}
api.SetApp(router)
log.Fatal(http.ListenAndServe(":8080", api.MakeHandler()))
} type User struct {
Id string
Name string
} type Users struct {
sync.RWMutex
Store map[string]*User
} func (u *Users) GetAllUsers(w rest.ResponseWriter, r *rest.Request) {
u.RLock()
users := make([]User, len(u.Store))
i :=
for _, user := range u.Store {
users[i] = *user
i++
}
u.RUnlock()
w.WriteJson(&users)
} func (u *Users) GetUser(w rest.ResponseWriter, r *rest.Request) {
id := r.PathParam("id")
u.RLock()
var user *User
if u.Store[id] != nil {
user = &User{}
*user = *u.Store[id]
}
u.RUnlock()
if user == nil {
rest.NotFound(w, r)
return
}
w.WriteJson(user)
} func (u *Users) PostUser(w rest.ResponseWriter, r *rest.Request) {
user := User{}
err := r.DecodeJsonPayload(&user)
if err != nil {
rest.Error(w, err.Error(), http.StatusInternalServerError)
return
}
u.Lock()
id := fmt.Sprintf("%d", len(u.Store)) // stupid
user.Id = id
u.Store[id] = &user
u.Unlock()
w.WriteJson(&user)
} func (u *Users) PutUser(w rest.ResponseWriter, r *rest.Request) {
id := r.PathParam("id")
u.Lock()
if u.Store[id] == nil {
rest.NotFound(w, r)
u.Unlock()
return
}
user := User{}
err := r.DecodeJsonPayload(&user)
if err != nil {
rest.Error(w, err.Error(), http.StatusInternalServerError)
u.Unlock()
return
}
user.Id = id
u.Store[id] = &user
u.Unlock()
w.WriteJson(&user)
} func (u *Users) DeleteUser(w rest.ResponseWriter, r *rest.Request) {
id := r.PathParam("id")
u.Lock()
delete(u.Store, id)
u.Unlock()
w.WriteHeader(http.StatusOK)
}
这里有个巨坑,找了好久才发现:
 type User struct {
     Id   string
     Name string
 }
这些变量必须大写,如果小写的,程序不会报错,但是没有结果。(我对json不太会,估计是这个问题)
还有就是go 封装的PostgreSQL driver,我已无力吐槽,API明显不给力,写的SQL各种出错,但是不知道错误原因,硬是各种看SQL怎么错了。
RESTful架构搜集的更多相关文章
- angular中使用ngResource模块构建RESTful架构
		
ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入 ...
 - 理解RESTful架构
		
越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高 ...
 - angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构
		
ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入 ...
 - Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试 (转)
		
环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...
 - [转]理解RESTful架构
		
原文地址:http://www.ruanyifeng.com/blog/2011/09/restful 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件" ...
 - “RESTful架构”相关资料收藏
		
[阮一峰]理解RESTful架构 [InfoQ]深入浅出REST 用于构建 RESTful Web 服务的多层架构 REST会是SOA的未来吗? Restful 与 SOA 的关系? 回答1: 注意r ...
 - RESTful架构入门
		
理解RESTful架构 - 阮一峰的网络日志http://www.ruanyifeng.com/blog/2011/09/restful RESTful API 设计指南 - 阮一峰的网络日志http ...
 - 追踪app崩溃率、事件响应链、Run Loop、线程和进程、数据表的优化、动画库、Restful架构、SDWebImage的原理
		
1.如何追踪app崩溃率,如何解决线上闪退 当 iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上.crash日志上有很多有用的信息,比如每个正在执行线程的完整堆栈 跟踪信 ...
 - 理解RESTful架构(转载)
		
本文转载自:http://www.ruanyifeng.com/blog/2011/09/restful.html 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软 ...
 
随机推荐
- html页面表格导出到excel总结
			
转载:http://www.cnblogs.com/liuguanghai/archive/2012/12/31/2840262.html <table id="tableExcel& ...
 - android vector pathData探究,几分钟绘制自己的vectordrawable
			
之前经常看到一些酷酷的图标效果, 深入进去发现不是直接用的图片, 而是一些以Vector标签开头的xml文件, 于是就看到了如下代码: <vector xmlns:android="h ...
 - codeforces   460C. Present   解题报告
			
题目链接:http://codeforces.com/submissions/ywindysai 题目意思:有 n 朵花,每朵花都有一定的高度(第 i 朵花对应 ai),m 天之后要把这些花送给别人. ...
 - 如何修改Windows的默认安装路径
			
运行中输入regedit打开注册表编辑器 展开注册表“HKEY_LOCAL_MACHINE\Software\Microsoft\ Windows\ CurrentVersion”分支, 在窗口的右侧 ...
 - coeforces 665D D. Simple Subset(最大团orsb题)
			
题目链接: D. Simple Subset time limit per test 1 second memory limit per test 256 megabytes input standa ...
 - 插入排序(InsertionSort)
			
位置p上的元素存储于tmp(第一趟p通常取1),而(位置p之前)所有更大的元素都向右移动一个位置. 然后tmp被放在正确的位置上. 代码: public class InsertionSort { p ...
 - CF 1009 F Dominant Indices —— 长链剖分+指针
			
题目:http://codeforces.com/contest/1009/problem/F 也可以用 dsu on tree 的做法,全局记录一个 dep,然后放进堆里,因为字典序要最小,所以再记 ...
 - poj3613Cow Relays——k边最短路(矩阵快速幂)
			
题目:http://poj.org/problem?id=3613 题意就是求从起点到终点的一条恰好经过k条边的最短路: floyd+矩阵快速幂,矩阵中的第i行第j列表示从i到j的最短路,矩阵本身代表 ...
 - 利用Dockerfile文件创建带有sshd服务的centos镜像
			
利用Dockerfile文件创建带有sshd服务的centos镜像 标签:dockerfile 1.安装docker并启动docker,不在赘述 2.创建使用Dockerfile安装sshd服务的目录 ...
 - maven构建java项目、web项目
			
maven构建java项目.web项目 一.mvn构建web项目 1安装mvn(包括path) 2命令:mvn archetype:create -DgroupId=cn.edu.sdau.neat ...