詢問sinatra與rest-client


#1

另外開新帖詢問

免得太長了

我先用

sinatra 功能 寫一個 app.rb

require "sinatra"
require "json"


get '/json_view' do 
   content_type :json
  { :user_id => '452452', :pay_ment => '1800', :time_out => '1200',:avatar_url => 'http://www.abcdefg.com.tw', :site_admin => 'false'}.to_json
end

然後執行 ruby app.rb

就可以在
http://localhost:4567/json_view

看到結果

使用 curl 'http://localhost/json_view

可以返回json字串

curl 屬於linux裡的 文件傳輸工具

這裡不知道可以在ruby的環境中有那些實際的用途?

另一個問題

http://www.ctolib.com/rest-client.html

裡面 有很多指令 例如

RestClient::Request.execute

這個我用老半天還是搞不懂這個是用在哪個位置

是寫在ruby檔案中嗎?
還是直接在shell 裡面直接下指令看得?

還是2個都可以用?

我在 shell 裡下達

`RestClient::Request.execute(:method => :get, :url => 'http://localhost:4567/json_view', :payload => post_params, :timeout => 9000000, :headers => {:accept => :json})`

我試了老半天 都是會出現錯誤訊息
bash: syntax error near unexpected token `:method’

不知道哪個方向有錯

都不好意思來這裡當伸手牌

不知道哪邊有教學影片可以參考 :disappointed_relieved:


#2

Orz" … 丟掉你的

system()
``
%x%%  #等同上個用法

以後也不要用,全改用 Open3 系列 https://apidock.com/ruby/v1_9_3_392/Open3/capture3 (這只是其中一個 method),因為你才能"正常且完整的使用" shell / call system,包括 stdin / stdout / stderr 和 pipe 之類的用法哩

irb
> require 'open3' #這是 std lib 不用裝 gem
> stdout_str, stderr_str, status = Open3.capture3('ls @')
> status.success?
> stdout_str, stderr_str, status = Open3.capture3('ls .')
> status.success?
> stdout_str, stderr_str, status = Open3.capture3('file -' , :stdin_data => "YOOO")
> stdout_str, stderr_str, status = Open3.capture3('file -' , :stdin_data => "")
> stdout_str, stderr_str, status = Open3.capture3('file -' , :stdin_data => " ")

你應該可以比較出中間的差異才是,這樣才能分離 stdout 中的 stdout / stderr / status,否則你用原本的 method 怎樣判定這個指令是否正確 & 同時取得回傳值?

& 請測試的時候盡量最小化測試,類似

gem i rest-client
irb
> require 'rest-client'
> response = RestClient::Request.execute(:method => :get, :url => 'https://www.google.com/')
> response.headers
> response.body[0..100]

anyway 玩看看唄?

至於 code 要寫在哪裡?就寫在 class / module / methods 裡面哩,你的 code 需要整理並包裝不是?

我之前寫過一個小的應用貼在這邊給你參考,你也會知道上面有個其中的輸入值 ‘-’ 是啥意思才是


#3

好的 我再研究看看

這幾天好多新東西啊~~~

又愛又恨

:flushed:


#4

回覆一下
順便當作教學文與請教文

ok 廢話不多說 先來整理一下這幾天玩得restclient 真的是好玩啊~~~

首先安裝 restclient

sudo gem install  restclient   

sudo apt-get install ruby-dev zlib1g-dev liblzma-dev

主要是執行 restclient 他還有dev要安裝 看實際缺啥 記得裝 我是一直沒看懂他寫的提示 所以一直以為壞掉:fearful:

安裝 sinatra
sudo gem install sinatra

好了就開個app.rb 執行時就用 ruby app.rb

檔案中

require "sinatra"
require "json"
require "rest-client"

get '/user_json_view' do 
   content_type :json
   { :user_id => '452452', :pay_ment => '1800', :time_out => '120',:avatar_url => 'http://www.abcdefg.com.tw', :site_admin => 'false'}.to_json
end

直接輸出json格式

get '/' do
    @page_one_post = 'JSON 字串 POST測試'
    erb :'index.html'
end

跟rails用法很像 將html檔案放置…/views/index.html.erb 即可 讀入使用檔案使用

get ‘/hello/:name’ do
"Hello #{params[:name]}!"
end

這個就不陌生了 簡單傳遞參數 例如 http://localhost:4567/hello/hoho

顯示hoho出來

get '/json_post_view' do 
  api_key = ApiKeyMaker.make_api_key(13)
  RestClient::Request.execute(method: :post,
                            url: 'http://localhost:4567/path',
                            api_key: api_key.to_s,
                            payload: {:param_1 => "1" ,:api_key => api_key.to_s}.to_json,
                            headers: {"Content-Type" => "application/json"}
                           )
end


post "/path" do
  request.body.rewind  # back to the head, if needed
  data = JSON.parse(request.body.read)

  "nice good  #{data}" # echo server!
  
end

組合用法 裡面有放一個gem ApiKeyMaker

從/json_post_view 裡面進去 將資料送到 /path 路徑

/path 可以做很多判斷 或是SQL 做資訊驗證後再回覆給 /json_post_view 顯示

get '/solvc' do 
  url = "http://localhost:4567/user_json_view"
  
  response = RestClient.get(url) { |response, request, result, &block|
  case response.code
  when 200
    for_json = JSON(response).to_s
    "<div>您呼叫回來的JSON為 :</div>" + "<div>" + for_json + "</div>"
    response
  when 423
    raise SomeCustomExceptionIfYouWant
  else
  	"<div>error</div>"
    #response.return!(&block)
  end
}
end

官方用法 直接用回復狀態來確認是否有訊息以及網頁的狀態回復

相關用法 可以參考 https://github.com/rest-client/rest-client

--------題外話----------

原本要用rest-client來實作 被動端

不管原廠商如何擺爛 就把東西撈過來處理

但是後面發覺還是不行 原因是原始網站架構還是有回傳的動作 我根本不知道原始網站需要哪些東西

而且原網站會綁類似課務系統 我單方面做 反而它原始系統還是無法完成整個流程

廠商原本的網站 都不處理 在不確定的技術 要花的時間成本 其實比想像的高

所以反過來 製作金融中介平台 然後擺爛的廠商之後有機會在取代掉就好 不然花在這上面的時間實在太多了

金融中介平台 主要是處理中間金額過來之後 主要的金融支付行為 還是以銀行或是代收代付的系統為主
(簡單講 就是一個過水用的中介平台)

1.確定是本人POST 資料
2.給使用者自己選擇要哪一種的方式繳費(歐付寶 或是ATM 或是合作金庫 或是 …other)
3.紀錄付錢的過程與狀態
4.不同語言間的處理方法
5.基本的防攻擊處理

確定的話題大概會圍繞在這些點上面
這裡面有錢可以賺嗎~~~~??
我怎看也是夠補貼生活費而已
技術債一狗票
反而初期流量 不是真正的問題所在 (真不行 NOSQL可以解決一些問題)
(如果還是可以交易量大到可以弄爆一般server 我一定要找jc大合作重新弄整個架構 求抱大腿 :sweat_smile:)

1.確定是本人POST 資料
JSONP 配合 SSL 並在對方站點配置一個API-KEY生成的流程

APIKEY就單筆交易重頭到尾 免得流程中間被插入偽造的無意義資料

2.給使用者自己選擇要哪一種的方式繳費(歐付寶 或是ATM 或是合作金庫 或是 …other)
這個就大量去簽約 然後整合 只是框架部分要想好 不然會自己打結

3.紀錄付錢的過程與狀態
我個人的想法 處理APIKEY 帳單的POST接收 以及轉POST 這個流程把它獨立於一個硬體下
而過程紀錄 這些就屬於查詢的用途 就讓他獨成一個平台 免得有突然爆量的交易事項讓查詢平台也一起掛掉

4.不同語言間的處理方法
這個東西我感覺到最後就只要不同語言轉換為HTML 以及JS來處理即可
轉到 HTML之後 JSONP 配合 SSL 不同程式語言即可使用

5.基本的防攻擊處理
除了上述的 JSONP 配合 SSL 大概就是用APIKEY生成的時候順便紀錄IP來源
如果做大 勢必也要用固定的APIKEY來確認是哪個網站來的單據

等於多平台接到一個平台的情況勢必要2個APIKEY以上去處理識別

然後 如果同來源嘗試次數太多 追加KEYIN CAPTCHA

我大概想到的就這樣…求指教. 我打得好累阿…


#5

看得出来,LZ 是 Ruby 新手。首先隆重向你推荐 IRB,这是一款交互式命令行工具。安装好 Ruby 以后,可以在控制台(Console)中调用。在这里你可以使用任何 Ruby 语法、命令。

对于 Ruby 的入门教程:官方的就很棒

然后,需要了解具体 Gem ,参考他们的 README 即可。都是相同的模式