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

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

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

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

Q&A

解決済

1回答

937閲覧

socketでリクエスト送ったけれど返ってこない

kazuyakazuya

総合スコア193

Ruby

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

0グッド

0クリップ

投稿2019/07/25 10:18

編集2019/07/25 10:27

知識は素人なのでご了承ください。
socketのwriteメソッドを使ってHTTPリクエストを送ってレスポンスを取得したいです。

ruby

1require 'socket' 2 3http = TCPSocket.open('teratail.com',443) 4 http.write('HTTPリクエスト') 5http.close

デバッグツールを使って
リクエストヘッダーフィールドを取得しました。
イメージ説明

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3 Accept-Encoding: gzip, deflate, br Accept-Language: ja,en-US;q=0.9,en;q=0.8 Cache-Control: max-age=0 Connection: keep-alive Cookie: tt_stc=24ba省略・・・ Host: teratail.com Referer: https://teratail.com/questions/64231 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36

よって

ruby

1 2require 'socket' 3post = TCPSocket.open("teratail.com",443) 4 post.write('GET / HTTP/1.1(CR+LF) 5 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3(CR+LF) 6 Accept-Encoding: gzip, deflate, br(CR+LF) 7 Accept-Language: ja,en-US;q=0.9,en;q=0.8(CR+LF) 8 Cache-Control: max-age=0(CR+LF) 9 Connection: keep-alive(CR+LF) 10 Cookie: tt_stc省略(CR+LF) 11 Host: teratail.com(CR+LF) 12 Referer: https://teratail.com/questions/64231(CR+LF) 13 Upgrade-Insecure-Requests: 1(CR+LF) 14 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36(CR+LF)(CR+LF) 15 ') 16 17 while a = post.gets 18 puts a 19 end 20 21 post.close 22

のように改行を入れて送ったのですが返ってきません。
いちおうクッキーを削除したパターンのも試したのですがだめでした。
原因はなんでしょうか?
やはり、やりかたから間違えていますか?
分からないのでお願いします。

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

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

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

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

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

gentaro

2019/07/25 10:26

初心者マークつけてるならタイトルに「初心者」は不要です。
kazuyakazuya

2019/07/25 10:27

ありがとうございます。 了解しました。
退会済みユーザー

退会済みユーザー

2019/07/25 10:55

net/httpではなくsocketを使いたい理由はありますか? 普通にwebサイトアクセスやAPIエンドポイントを叩くのであればnet/httpが良いかと思いますが。
kazuyakazuya

2019/07/25 10:58

ありがとうございます。 あえてsocketを使いたいです。 net/httpで簡単にwebサイトを叩くものは作れました。
guest

回答1

0

ベストアンサー

443ポートと言うことは、SSL(https)ですね。openの後は暗号化して送信する必要があります。
応答も暗号化されて帰ってきます。
これをソケットライブラリだけでやるには、かなりの勉強が居ると思います。

HTTPプロトコルの勉強だと、まずはSSLでない通信をやった方が良いでしょう。

適当なサーバーがなければ、

ruby -run -e httpd -- "どこかのディレクトリへのパス"

で、指定したディレクトリをドキュメントルートとしたhttpサーバーが起動しますので、http://localhostへリクエストを出せばよいでしょう。

投稿2019/07/25 11:05

otn

総合スコア84487

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

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

kazuyakazuya

2019/07/25 11:20

ありがとうございます。 普通のHTTPから試してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問