API: application programming interface

在Ruby中特指调用某个对象的信息,如hash的方法库library中的方法,参数,回传值等。


视频:如何用Rails 建立api系列

https://gorails.com/series/how-to-build-apis-with-rails

教程1:

app文件的位置:自我练习/weather

Readme.rb

建立了2个model, Location, recording. 一对多关联
建立了2个controller,继承关系
ApiController
ApiController::Api::V1::LocationsController
建立了一个show.json.jbuilder.
 
如果像这样,没有明确指定1.json格式:
http://localhost:4000/api/v1/locations/1
则会使用ApiController的默认设置:

before_action :set_default_format

def set_default_format

  request.format = :json

end

views/ ../show.json.jbuilder

json.id @location.id

json.name @location.name
json.current do
  json.temp @location.recordings.last.temp
  json.status @location.recordings.last.status
  # json.temperature @location.recordings.each do |record|
  #   json.temperature record.temp
  # end
end

在controller的locations_controller.rb中,可以指定action渲染json格式的数据对象:

也可以在view中写。

  def show
     render json: {
       id: @location.id,
       name: @location.name
     }
  end


https://github.com/rails/jbuilder

Jbuilder(3300✨)

Jbuilder gives you a simple DSL for declaring JSON structures that beats manipulating giant hash structures. This is particularly helpful when the generation process is fraught with conditionals and loops. Here's a simple example:

定义一个属性和结构的名字(动态的),使用 set! 方法

json.set! :author do

json.set! :name, 'David'

end

#=> {"author": {"name": "David"}}

合并一个已存在的hash,或者array到当前的content, 使用merge! 方法

hash = { author: { name: "David"} }

json.post do

json.title "Merge HOWTO"

json.merge! hash

end

# => "post": { "title": "Merge HOWTO", "author": { "name": "David" } }

可以使用ruby 语法, each,  比如案例中的:

  # json.temperature @location.recordings.each do |record|
  #   json.temperature record.temp
  # end

也可以使用array! , 同样是针对一对多的关联,只要是数组集合就行。

方便的写法写:提取指定的属性:

json.array!  @location.recordings,  :temp, :status

使用array!,可以输出array类型的资料

Jbuilder对象可以直接互相被嵌套到:

比如建立1对多关联的表。

company = Company.new("Dell", Person.new("John", 36))

company.to_builder.target!

把对象变成jbuilder对象。

# => {"name": "Dell", "president":{"name":"John", "age":58}}

可以用于ActionView template language。 如show.json.jbuilder.

也可以用partials。 如views/comments/_comments.json.jbuilder, 然后设定一个局部变量comments :

json.partial! 'comments/comments', comments: @message.comments

可以渲染partials集合:

json.array! @posts, partial: 'posts/post', as: :post

或者

json.partials! partial: 'posts/post', collection: @posts, as: :post

《绿色框内的可以不写。》

写法有多种

可以使用:local选项传入任意对象到局部模版:

json.partials! "sub_template", locals: {user: :user}

支持碎片缓存fragment caching: Rails.cache

json.cache! ['v1', @person], expires_in: 10.minutes do
json.extract! @person, :name, :age
end

Web API (第2个视频)

JSON Web Tokens(JWT) vs Rails Session Cookies (新知识点)

https://jwt.io/

Encode编码,Decode解码, payload载何

使用JWT 来为你的API做验证authentication。

JWT必须手动加入每个request。你自己必须把它们放到你的headers,这意味者它们不会自动的发送。

所以服务器总是认为你是登出的状态。

如何做token验证的讨论:

https://ruby-china.org/topics/34317

用JWT做验证(基础的理解, 有rails建设步骤step to step)

https://www.jianshu.com/p/56467f890516

ruby-jwt(2100✨) 一个gem.

实做: ~/自我练习/jwt_api (已上传git)

https://github.com/chentianwei411/JsonWebToken-API

gem 'bcrypt', '~> 3.1.7'

'用于严格化Rails密码验证,在model中使用password_digest属性,配合has_secure_password。

因为5.2已经放弃使用secrets, 改用credentials。所以需要在Token类中,改用crendentials。(替换掉secrets)

更多案例见git和转化模版见jwt.io)


Curl(transfer a url)

description:

一个把数据转化到服务器,或从服务器转化下来的工具。用于没有用户交互界面的时候,直接输入命令。

curl offers  useful tricks like proxy support, user authentication, FTP upload, HTTP post, SSL connections, cookies, file transfer resume, Metalink, and more.

基本用法:

curl [options/ URLs]

curl -X POST -d username="json" -d password="12345" http://localhost:3000/authentication

解释:

-X/--require <command>  指定什么命令

-d/--data <data>           是POST方式下传输数据。

curl -v --header "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE1MzE2NTYzMTR9.bk6_4kCdMzXO1K-BX6I6XDWjGHRarXT0tUixklrSVkw " http://localhost:3000/users

--header  传递客制化header给server

-v 显示连接的更多信息。

(方便的方法使用chrome插件:postman)


httpie   36000✨

https://github.com/jakubroztocil/httpie#linux

介绍:

一个类似cURL的工具。一个命令行HTTP client。和web server交互更友好。

提供了简单的http命令,允许使用简单自然的syntax来发送HTTP requests,并显示彩色的输出。

用处:

测试,debug, 和服务器交互。

安装  brew install httpie

命令:

http -v url  #显示request和全部response,和curl类似。

http --help #帮助


rails routes | grep auth

抓取auth, 显示相关routes。


status:HTTP status code.

https://zh.wikipedia.org/wiki/HTTP%E7%8A%B6%E6%80%81%E7%A0%81



JWT

由Header, Payload, Signature三个部分组成。xxxxx.yyyyy.zzzzz

Header:

由token的类型"JWT"和算法algorithm hash类型组成。

Payload:

第二部分的token 。 声明:一个主体和附加的数据。由三种格式: registered, public, private

  • Registered claims: 这些是一组预制的声明,非强制但推荐。这些声明提供了有用的,内操作的声明。比如: iss(issuer), exp(expiration time), sub(subject), aud(audience),等等(文档)
{
"iss": "JWT-Rails-Server", // 签发者
"aud": "www.baidu.com", // 接收者
"iat": 1472263256, // JWT 签发的时间
"exp": 1472522525, // 过期时间
"sub": "jwt@baidu.com" // JWT对应的用户
"user_id": 1211 // 自定义 Private Claims
}
  • Public claims:注意名字不要和预制的重复。或者定义一个URL 包括a collision resistant namespace.
  • Private Claims:  自定义的声明。用来在parties间分享数据

⚠️不要在Payload上写敏感信息。

Signature

使用指定的algorithm标记,包含编码的header, 编码的payload, 和密匙secret。如:

HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload), ) secret base64 encoded
这个签名用于确保信息不会被改变。

JSON Web Tokens如何工作的?

无论何时,一个用户想要进入/取出 一个受到保护的route/resource, 这个用户必须提供JWT,

Authorizaton header中使用the Bearer schema。

header的内容应该是这个格式:

Authorization: Bearer <token>


服务器的受到保护的routes会在这个Authorization header中核查JWT,如果JWT存在于服务器,用户就可以用受到保护的resources.

如果JWT包括了必须的data, 就需要查询数据库。

流程flow:

  1. 客户或程序请求authorizations到授权服务器。
  2. 当authorization is granted,授权服务器返回一个access token给app
  3. App使用这个token来存取一个受到保护的resource(如an API)

Rails使用https://github.com/jwt/ruby-jwt, 这个gem。

方法案例:

HMAC的编码,包括HS256等:

token = JWT.encode(payload, 密匙,"HS256")  #payload是hash,见上⬆️。

JWT.decode(token, 密匙, true,  {algorithm: 'HS256'})

hmac_secret = 'my$ecretK3y'

token = JWT.encode payload, hmac_secret, 'HS256'

# eyJhbGciOiJIUzI1NiJ9.eyJkYXRhIjoidGVzdCJ9.pNIWIL34Jo13LViZAJACzK6Yf0qnvT_BuwOxiMCPE-Y
puts token decoded_token = JWT.decode token, hmac_secret, true, { algorithm: 'HS256' } # Array
# [
# {"data"=>"test"}, # payload
# {"alg"=>"HS256"} # header
# ]
puts decoded_token

标准格式:

token = JWT.encode payload, key, algorithm='HS256', header_fields={ }

Payload中的exp到期声明:

exp = Time.now.to_i + 4 * 3600
exp_payload = { data: 'data', exp: exp } token = JWT.encode exp_payload, hmac_secret, 'HS256' begin
decoded_token = JWT.decode token, hmac_secret, true, { algorithm: 'HS256' }
rescue JWT::ExpiredSignature
# Handle expired token, e.g. logout user or deny access
end

⚠️可以在decode()中增加一个误差{leeway: 30} 30秒

其他声明如iss, aud, iat(Issued At)等

都是可以验证的,{verify_XXX: true,}不符合的会❌,具体见git

GoRails教程自建Rails 的 API; gem 'jbuilder'简单用法;使用JWT进行验证(git上的实做);curl命令使用;status状态码;JWT文档翻译摘录;的更多相关文章

  1. [Ruby on Rails系列]6、一个简单的暗语生成器与解释器(上)

    [0]Ruby on Rails 系列回顾 [Ruby on Rails系列]1.开发环境准备:Vmware和Linux的安装 [Ruby on Rails系列]2.开发环境准备:Ruby on Ra ...

  2. 全--教程API, gem 'rest-client'(用于发简单请求); 请求测试;

    安装:rest-client4400✨ gem install rest-client 一个简单的HTTP和REST client for Ruby. 可以用它来发HTTP请求 基本用法: requi ...

  3. rails 构建 API

    我是来鼓吹使用 Rails 写 API 的. 原文在此: https://labs.kollegorna.se/blog/2015/04/build-an-api-now/ 原文有一个很大的缺陷就是读 ...

  4. Docker入门教程(七)Docker API

    Docker入门教程(七)Docker API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第七篇,重点介绍了Docker Registry API和 ...

  5. SAE搭建WordPress教程 免费建WordPress博客站

    SAE搭建WordPress教程 免费建WordPress博客站 WordPress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设自己的网志.当然,用户也可以 ...

  6. EntityFramework 5.0 CodeFirst 教程01-搭建环境和快速上手

    ----------------------------目录------------------------------ EntityFramework 5.0 CodeFirst 教程03-数据结构 ...

  7. Axure快速原型教程02--创建页面和设置界面

    目录 Axure快速原型教程02--创建页面和设置界面 Axure快速原型教程01--原型说明下载和安装 首先,在左侧的面板中,我们发现有一个叫sitemap的面板,这个面板就是我们的一个个的页面了, ...

  8. Python爬虫教程-31-创建 Scrapy 爬虫框架项目

    本篇是介绍在 Anaconda 环境下,创建 Scrapy 爬虫框架项目的步骤,且介绍比较详细 Python爬虫教程-31-创建 Scrapy 爬虫框架项目 首先说一下,本篇是在 Anaconda 环 ...

  9. VuePress教程之深入理解插件API

    VuePress教程之深入理解插件API 本文目录 1 VuePress教程之深入理解插件API 2 插件 ??? 2.1 暖暖身 2.2 插件如何运作 3 准备 3.1 Markdown 3.2 P ...

随机推荐

  1. PAT 1110 Complete Binary Tree[比较]

    1110 Complete Binary Tree (25 分) Given a tree, you are supposed to tell if it is a complete binary t ...

  2. 自动填写IE的网页的输入框的内容

    procedure TForm1.PutData; var ShellWindow: IShellWindows; nCount: integer; spDisp: IDispatch; i,j,X: ...

  3. HDU 4746 Mophues(莫比乌斯反演)

    题意:求\(1\leq i \leq N,1\leq j \leq M,gcd(i,j)\)的质因子个于等于p的对数. 分析:加上了对质因子个数的限制. 设\(f(d):[gcd(i,j)=d]\) ...

  4. 一个辅助AWVS C段扫描的小php脚本

    小菜写的小脚本,大牛轻拍砖~~~~~~ 渗透前信息收集时喜欢用椰树来获取旁站及二级域名,然后根据二级.三级域名地址扩展C段,扩大扫描业务边界.例如 以联想为例 但,各个旁站对应IP可能不同,或有CDN ...

  5. $Python技巧大全

    知乎上有一个问题:Python 有什么奇技淫巧?其中有各种不按套路出牌的招数,也不乏一些惊为天人的"奇技淫巧",会让你大呼:居然还有这种操作??? 本文就是对日常使用过的或者觉得很 ...

  6. pigeon 介绍

    https://github.com/dianping/pigeon Pigeon开发指南 Pigeon是一个分布式服务通信框架(RPC),在美团点评内部广泛使用,是美团点评最基础的底层框架之一. 主 ...

  7. webservice、WSDL简介

    Webservice是跨平台.跨语言的远程调用技术 通信机制的本质是xml数据交换 采用soap协议进行通信 而WSDL 指网络服务描述语言 (Web Services Description Lan ...

  8. 20145303 实验一 Java开发环境的熟悉(Linux + Eclipse)

    20145303 实验一 Java开发环境的熟悉(Linux + Eclipse) 实验题目(4):实现学生成绩管理功能,并进行测试 思路: 对于实现学生成绩管理(student performanc ...

  9. 20144303 《Java程序设计》第二次实验实验报告

    20144303 <Java程序设计>第二次实验实验报告 北京电子科技学院(besti)实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握U ...

  10. 20135320赵瀚青LINUX内核分析第三周学习笔记

    赵瀚青原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 概述 本周是学习的主要是构造 ...