今天才知道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架构搜集的更多相关文章

  1. angular中使用ngResource模块构建RESTful架构

    ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入 ...

  2. 理解RESTful架构

    越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高 ...

  3. angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构

    ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入 ...

  4. Yii2 基于RESTful架构的 advanced版API接口开发 配置、实现、测试 (转)

    环境配置: 开启服务器伪静态 本处以apache为例,查看apache的conf目录下httpd.conf,找到下面的代码 LoadModule rewrite_module modules/mod_ ...

  5. [转]理解RESTful架构

    原文地址:http://www.ruanyifeng.com/blog/2011/09/restful 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件" ...

  6. “RESTful架构”相关资料收藏

    [阮一峰]理解RESTful架构 [InfoQ]深入浅出REST 用于构建 RESTful Web 服务的多层架构 REST会是SOA的未来吗? Restful 与 SOA 的关系? 回答1: 注意r ...

  7. RESTful架构入门

    理解RESTful架构 - 阮一峰的网络日志http://www.ruanyifeng.com/blog/2011/09/restful RESTful API 设计指南 - 阮一峰的网络日志http ...

  8. 追踪app崩溃率、事件响应链、Run Loop、线程和进程、数据表的优化、动画库、Restful架构、SDWebImage的原理

    1.如何追踪app崩溃率,如何解决线上闪退 当 iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上.crash日志上有很多有用的信息,比如每个正在执行线程的完整堆栈 跟踪信 ...

  9. 理解RESTful架构(转载)

    本文转载自:http://www.ruanyifeng.com/blog/2011/09/restful.html 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软 ...

随机推荐

  1. ICE协议下NAT穿越的实现(STUN&TURN)

    正文: 一. 首先来简单讲讲什么是NAT? 原来这是因为IPV4引起的,我们上网很可能会处在一个NAT设备(无线路由器之类)之后.NAT设备会在IP封包通过设备时修改源/目的IP地址. 对于家用路由器 ...

  2. codeforces A. Punctuation 解题报告

    题目链接:http://codeforces.com/problemset/problem/147/A 题目意思:给定一篇文章,需要对这篇文章进行编辑,使得:(1)两个单词之间有一个空格分开  (2) ...

  3. TP框架中的多种方法代码(C,G,L,T,I,N,D,M,A,R,B,U,W,S,F,E)

    C方法 function C($name=null, $value=null,$default=null) { static $_config = array(); // 无参数时获取所有 if (e ...

  4. deepin软件中文乱码

    如图所示,deepin软件,会有这种情况,中文全是乱码,口口口.这表示很讨厌,学长给出的解决办法,将系统换成英文语言,这样确实解决了乱码,但是还是有问题,比如在写中文注释,又变成这样了. 去deepi ...

  5. windows下使用emacs+plink远程编辑erlang文件

    1)plink.exe属于putty套件, 注册到环境变量;emacs的bin目录也要注册到环境变量中; 2)在.emacs中增加如下: (require 'tramp)(setq tramp-def ...

  6. hdu-5726 GCD(rmq)

    题目链接: GCD Time Limit: 10000/5000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) Prob ...

  7. 【C/C++】函数指针

    首先必须要清楚如下: [1]函数指针即函数的地址,也就是存储其机器语言代码的首地址.该地址用函数名表示. [2]用具体的函数名给函数指针变量赋值时必须满足两者的类型(即函数返回值类型)和特征标(即函数 ...

  8. eclipse代码编辑器中按alt+/提示No Default Proposals 的解决方法

    window-> Preferences-> Java-> Editor-> Content Assist-> Advanced 上面的选项卡Select the pro ...

  9. poj1639顶点度限制生成树

    题目:http://poj.org/problem?id=1639 对根的度数有限制的最小生成树: 先忽略根,跑最小生成树,得到几个连通块,再一一与根连上: 然后在限制内用根连出去的边来使生成树更小, ...

  10. Docker运行MongoDB及Redis及ssh端口映射远程连接

    Docker运行MongoDB及Redis及ssh端口映射远程连接 本节内容简介 在本实验里我们将通过完成 MongoDB 和 Redis 两个容器来学习Dockerfile及Docker的运行机制. ...