質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

1247閲覧

Net::HTTP postメソッドの使い方について不明点

kazuyakazuya

総合スコア193

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2019/07/23 14:43

編集2019/07/23 14:45

注意長文

いろいろ質問して
キーワードを検索欄に入れてそのレスポンスを取得するプログラムを作って
完成したと思っていたのですが
(ステータスライン200が返ってくるため)
実際にエンティティヘッダーを取得し、正規表現で検証したところ
ただただ "/"このパスのレスポンスを取得していただけだとわかりました。

前回はアマゾンで試したのですが
利用規約が怪しいとのことで
今回はteratailで検証します。
(見た限りでは利用規約に問題なし。ステータスコードも200を取得できる)
利用規約
まずやりたいこと
teratailのルートパスにアクセス
イメージ説明
上記に検索欄があります。
検索欄にいれるキーワードをプログラムコードから指定して
その結果を受け取りたいです。


イメージ説明
ruby と検索すると上記の画面(html)が返される。
無論、Net::HTTPのGETメソッドで直接URLを指定すれば
写せるかもしれないが、自分はあくまで
POSTメソッドでやりたいのです。

つまり、プログラムコードで検索欄のキーワードを指定したい

以下が自分が作ったコードです。

ruby

1require 'net/http' 2require 'uri' 3http= Net::HTTP.new("teratail.com",443) 4http.use_ssl = true 5http.verify_mode = OpenSSL::SSL::VERIFY_NONE 6response = http.post('/','q=ruby') 7puts "---ステータスコード---" 8puts response.code 9response.each do |name,value| 10 puts name + ":" + value 11end 12puts response.body

cmd

1---ステータスコード--- 2200 3server:nginx/1.13.12 4date:Tue, 23 Jul 2019 14:15:15 GMT 5content-type:text/html; charset=UTF-8 6x-frame-options:SAMEORIGN 7set-cookie:tt_stc=9da7f8196697063dfea5746f84810ea8; expires=Mon, 21-Oct-2019 14:15:15 GMT; Max-Age=7776000; path=/, tt_sec=b6f41d0c853acec053cfc84d2b05e04e; path=/, DSID=205b3db69808c2373b462eef9ba48705; expires=Tue, 23-Jul-2019 18:15:15 GMT; Max-Age=14400; path=/; HttpOnly, tt_rpd=Errors_error404; path=/, tt_stc=9da7f8196697063dfea5746f84810ea8; expires=Mon, 21-Oct-2019 14:15:15 GMT; Max-Age=7776000; path=/, tt_stc=dd18fad7a735dcddbd26d623f8c6baae; expires=Mon, 21-Oct-2019 14:15:15 GMT; Max-Age=7776000; path=/, tt_sec=0066e921f7ede281b79234384aeca841; path=/, CakeCookie[hFd7M1i8]=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; secure; HttpOnly, Cookies[uniqid]=Q2FrZQ%3D%3D.iiddLbrlw0vzdDe2sDptKtJd2tWkXijQDUVPA3IUqRo%3D; path=/; secure; HttpOnly, Cookies[referer]=Q2FrZQ%3D%3D.; path=/; secure; HttpOnly, Cookies[referer_host]=Q2FrZQ%3D%3D.; path=/; secure; HttpOnly, Cookies[sip]=Q2FrZQ%3D%3D.; path=/; secure; HttpOnly, Cookies[url_query]=Q2FrZQ%3D%3D.; path=/; secure; HttpOnly, Cookies[ab]=Q2FrZQ%3D%3D.iQ%3D%3D; expires=Sun, 19-Jan-2020 14:15:15 GMT; Max-Age=15552000; path=/; secure; HttpOnly 8accept-ranges:none 9vary:Accept-Encoding 10via:1.1 google 11alt-svc:clear 12connection:close 13transfer-encoding:chunked

となります。一見成功しているように見えますが
htmlを見るとただただ"/"このパスに飛ばされているだけだとわかります。
(htmlは出力結果があまりに大きすぎるため省略)

なにが原因はどこ(何のメソッドなのか)なのか?それはわかっているのです。
ただ、そのメドッドをいろいろいじってみても不明点が多いため
教えてください。

原因はたぶんこれです。

ruby

1response = http.post('/','q=ruby')

リファレンス
postメソッド
イメージ説明

上記の画像の通りなら

ruby

1post(第一引数にパスを指定、第二引数に送りたいもの検索キーワード)

よって
teratailの検索キーワードを打つ画面のパスは(ここでは)
"/"
だから指定するパスは"/"

リンク内容

url

1https://teratail.com/search?q=ruby

検索欄にrubyと打ち込んで実行した後のURLはこうなっていることから

第二引数に送りたいもの検索キーワードはq=ruby
(いろいろなパターンを試したがだめだった)
よって

ruby

1response = http.post('/','q=ruby')

だからこうなると思っていたのですが
実行すると上の通り
返ってくるのはコレ(検索後)ではなく
コレ(検索前)。。。

やってみたこと

ruby

1response = http.post('/','適当に入れる')

第二引数(検索キーワードを入れたいところ)
に適当に値を入れて実行しました。
エラーが起きると思いきや

ruby

1---ステータスコード--- 2200 3server:nginx/1.13.12 4date:Tue, 23 Jul 2019 14:40:04 GMT 5content-type:text/html; charset=UTF-8 6x-frame-options:SAMEORIGN 7set-cookie:tt_stc=50250ef4e82c4aa68ecd4164dfc0b53d; expires=Mon, 21-Oct-2019 14:40:04 GMT; Max-Age=7776000; path=/, tt_sec=0639f1781f50367ba75dea147aee1392; path=/, DSID=2d5fb2c15bfe73aa9a703825eab68478; expires=Tue, 23-Jul-2019 18:40:04 GMT; Max-Age=14400; path=/; HttpOnly, tt_rpd=top; path=/, tt_stc=50250ef4e82c4aa68ecd4164dfc0b53d; expires=Mon, 21-Oct-2019 14:40:04 GMT; Max-Age=7776000; path=/, CakeCookie[hFd7M1i8]=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; secure; HttpOnly, Cookies[uniqid]=Q2FrZQ%3D%3D.jCBdLri3xhmiJT6xsTpsfoEFjofxCnWHWEUbVHZA%2FEw%3D; path=/; secure; HttpOnly, Cookies[referer]=Q2FrZQ%3D%3D.; path=/; secure; HttpOnly, Cookies[referer_host]=Q2FrZQ%3D%3D.; path=/; secure; HttpOnly, Cookies[sip]=Q2FrZQ%3D%3D.; path=/; secure; HttpOnly, Cookies[url_query]=Q2FrZQ%3D%3D.; path=/; secure; HttpOnly, Cookies[btn]=Q2FrZQ%3D%3D.nCwYQa7whkqx; path=/; secure; HttpOnly, Cookies[ab]=Q2FrZQ%3D%3D.iQ%3D%3D; expires=Sun, 19-Jan-2020 14:40:04 GMT; Max-Age=15552000; path=/; secure; HttpOnly 8accept-ranges:none 9vary:Accept-Encoding 10via:1.1 google 11alt-svc:clear 12connection:close 13transfer-encoding:chunked

なにがいけないのかわかりません。
かれこれ5時間格闘してます。
わからないのでお願いします。

質問の要約(説明が長かったから)
1.。。
postの使い方は間違っていますか?正しい使い方を教えてください。
こういうpostの使い方を紹介しているサイトは1つあったのですが
そのコードも結果は同様でした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

無論、Net::HTTPのGETメソッドで直接URLを指定すれば

写せるかもしれないが、自分はあくまで
POSTメソッドでやりたいのです。

そもそものアクセス自体がGETなので、無理やりPOSTでアクセスしても動かないことが考えられます。

投稿2019/07/24 00:15

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/07/24 00:16

> postの使い方は間違っていますか? この場面でPOSTを使う(HTTPのPOSTメソッドを送信する)こと自体が間違っています。
kazuyakazuya

2019/07/24 00:34

ありがとうございます。 では検索キーワードをプログラムから指定したい場合に 使うメソッドもGETなのですか?
maisumakun

2019/07/24 00:36

このTeratailの場合はそうです。
kazuyakazuya

2019/07/24 00:56

ありがとうございます。 メソッドから調べなおします。
guest

0

teratailの検索キーワードを打つ画面のパスは(ここでは)

"/"
だから指定するパスは"/"

間違ってますね。何を見たらそう誤解できるのか??
自分で、

https://teratail.com/search?q=ruby

と書いてるじゃない。

htmlを見るとただただ"/"このパスに飛ばされているだけだとわかります。

パスに/を指定しているから/が表示されているだけです。

そもそも、GETを使う前提で書かれたプログラムにPOSTを投げても駄目です。

投稿2019/07/23 15:21

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuyakazuya

2019/07/23 15:44 編集

ありがとうございます。何度もすみません [参考にしたサイト](https://blog.class-tech.me/how-to-send-http-methods-using-ruby-net-http-library/) このサイトのPOSTリクエストを送るというのを 参考にコードを作ったのですが postはPOSTリクエストを送るメソッドではないのですか? 間違ってますね。 ↓ パスは/searchですか? (パスについての認識がまだあいまいです・・・) /searchにすると404が返ってきます。
otn

2019/07/24 01:00 編集

> パスは/searchですか? そうです。「パスとは何か」が理解できていなかったんですね。 > /searchにすると404が返ってきます。 POSTだからでしょう。GETにすれば大丈夫です。
otn

2019/07/24 01:01

あと、HTMLの form タグについての理解も不足しています。
kazuyakazuya

2019/07/24 01:08

ありがとうございます。 クエリストリングという言葉も今さっき知りました。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問