Rubyでcurlした時のメモ
最近、Ruby系の記事多いけど、
初心者すぎ、かつ、バイト等で仕事に応じてPythonとPHPとか 言語変わるから、
Rubyに関してはいまだに
ruby 配列 長さ
とかでググってまうw
lengthやっけ?sizeやっけ?countやっけ?
とかパニックになるときあるんで。
Rubyでcurl
open-uri
net/http
とかいろいろあるけど、open-uriはGETしか使えなさそうなので、net/httpでcurlの処理書いてみます。
ベース
# -*- coding: utf-8 -*- require 'net/http' # curlのタイムアウト設定 time_out = 30 uri = URI.parse("http://hogepiyoheyhey.com") Net::HTTP.start(uri.host, uri.port){|http| #リクエストインスタンス生成 request = Net::HTTP::Post.new(uri.path) request["user-agent"] = "Ruby/#{RUBY_VERSION} MyHttpClient" request.set_form_data("uid"=>123456) #time out http.open_timeout = time_out http.read_timeout = time_out #送信 response = http.request(request) p "====RESULT(#{uri.host})========" p "==> "+response.body }
basic認証が入ったパターン
# -*- coding: utf-8 -*- require 'net/http' # curlのタイムアウト設定 time_out = 30 uri = URI.parse("http://hogepiyoheyhey.com") Net::HTTP.start(uri.host, uri.port){|http| #リクエストインスタンス生成 request = Net::HTTP::Post.new(uri.path) request["user-agent"] = "Ruby/#{RUBY_VERSION} MyHttpClient" request.set_form_data({"uid"=>"hogehoge"}) #time out http.open_timeout = time_out http.read_timeout = time_out #=====ここ追加====== #user auth request.basic_auth 'hogehoge','piyopiyo' #送信 response = http.request(request) p "====RESULT(#{uri.host})========" p "==> "+response.body }
httpsを使った場合
# -*- coding: utf-8 -*- require 'net/https' uri = URI.parse("https://hogepiyoheyhey.com") https = Net::HTTP.new(uri.host,uri.port) #httpsだとこれ必要 https.use_ssl = true #use_ssl value changed, but session already started (IOError) #にならないように、sslをONにしてから、request生成 request = Net::HTTP::Post.new(uri.path) request.set_form_data({"uid"=>"hogehoge"}) res = https.request(request) p res.body
ちょっと書き方変えたの気づきました?
上記の「ベースパターン」を利用すると
Net::HTTP.start(uri.host, uri.port){|http| request = Net::HTTP::Post.new(uri.path) https.use_ssl = true }
とコールバックっぽく書いてたけど、httpsやとこのやり方やとエラー吐いてた。
use_ssl value changed, but session already started (IOError)
とか怒られた。
uri = URI.parse("https://hogepiyoheyhey.com") https = Net::HTTP.new(uri.host,uri.port) #httpsだと先にこれを書く https.use_ssl = true #use_sslをtrueにした状態でPOSTするよ!って感じで書く request = Net::HTTP::Post.new(uri.path)
これでうまく行った。
他にいい方法はあるのだろうかー。
ちなみにですが、PHPだと
<?php $time_out = 30; $hoge = array( "uid"=>32, "name" => "Heyheyhey", ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://hogepiyohey.com"); curl_setopt($ch, CURLOPT_POST, TRUE); curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE); curl_setopt($ch, CURLOPT_POSTFIELDS, $hoge); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $time_out); curl_setopt($ch, CURLOPT_TIMEOUT, $time_out); //Basic認証の際はこちら curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC ) ; curl_setopt($ch, CURLOPT_USERPWD, "hogehoge:piyopiyo"); print "====RESULT========\n"; print "=>\n"; print curl_exec($ch); print "\n=========================================\n\n"; curl_close($ch); ?>
PHP落ち着くわーwww