HEYBlog about Technology

京都の学生エンジニアのエンジニアブログ

Rubyでcurlした時のメモ

最近、Ruby系の記事多いけど、

初心者すぎ、かつ、バイト等で仕事に応じてPythonPHPとか 言語変わるから、

Rubyに関してはいまだに

ruby 配列 長さ

とかでググってまうw

lengthやっけ?sizeやっけ?countやっけ?

とかパニックになるときあるんで。

Rubycurl

rubycurl関連使おうと思ったら、調べた結果

  • 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