以前、
UserAgentからOS/ブラウザなどの調べかたのまとめ
で色んなプログラミング言語から、HttpRequestを試す際、環境の準備にPlay with Dockerを使うのが便利だったので、使いかたを乗せておく。
Play with Dockerとは
Play with Dockerは使い捨てで使用できる、dockerの実行環境。
ブラウザさえあれば使用できて、自分のローカルPCの環境は何も変える必要は無い。
ローカルPCへのダウンロードが無いので、モバイル回線でも快適に使用することができる。
使用するには、dockerhubのアカウントが必要になる。
単に複数のプログラミング言語でHelloWorldやFizzbuzzをしたいという場合はideoneというサイトを使う手もあるが、追加モジュールを入れたりまでは出来ないので出来ることは限られてくる。
各言語でHttpRequestをしてみる
色んなプログラミング言語で、docker環境を作って、httprequestを実行を試してみる。
接続先はifconfig.io/uaにつないで、UserAgentを取得する。
初期状態のインスタンスはAlpine Linuxが入っている。そこからDocker In Dockerでdockerコンテナを起動することができる。
環境構築の難易度が楽で時間がかからないものは起動時のAlpine Linuxに環境を作って、
難易度が高いものや時間がかかるものはdockerコンテナをさらに立ち上げて作ることになるか。
Python
PythonはAlpine Linuxの初期インスタンスにインストール済みなので、Pythonコマンドでreplを起動
Python
>>> import requests
>>> requests.get("http://ifconfig.io/ua")
<Response [200]>
>>> requests.get("http://ifconfig.io/ua").text
u'python-requests/2.20.1\n'
Ruby
apkコマンドでruby-irbをインストール。irbでreplを起動
apk add ruby-irb
irb
irb(main):001:0> require 'net/http'
=> true
irb(main):002:0> Net::HTTP.get_print 'ifconfig.io', '/ua'
Ruby
=> nil
C#
monoが入ったDebianコンテナイメージを立ち上げる。
docker run -i -t mono /bin/bash
エディタとしてvimをインストール
apt-get update
apt-get install vim
エディタを開く
vim DownloadPageWebClient.cs
下記の内容を保存する。
using System;
using System.Net;
class DownloadPageWebClient
{
static void Main()
{
using (WebClient client = new WebClient()) {
string url = "https://ifconfig.io/ua";
string content = client.DownloadString(url);
Console.WriteLine(content);
}
}
}
ビルドして実行する。
mcs DownloadPageWebClient.cs
mono ./DownloadPageWebClient.exe
参考サイト
D言語
D言語のコンテナイメージを立ち上げる。
docker pull dlanguage/dmd
viを立ち上げる。
vi getua.d
以下の内容をviで作成してファイルを保存する。
import std.stdio,std.net.curl;
void main() {
auto content = get("http://ifconfig.io/ua");
writeln(content);
}
実行してみる。
$ docker run --rm -ti -v $(pwd):/src dlanguage/dmd dmd -run getua.d
Phobos-std.net.curl/2.080 (libcurl/7.47.0)
参考URL
Perl
perl-libwwwをインストールする。
apk add perl-libwww
client.plファイルを作成
cat <<'EOS' > client.pl
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $response = $ua->get('http://ifconfig.io/ua');
print $response->decoded_content;
EOS
client.plを実行する。
perl client.pl
httpsの場合
Perl6
Perl 6のコンテナイメージを立ち上げる。
docker run -it rakudo-star
以下のコマンドを実行。
> use v6;
> use LWP::Simple;
> my $html = LWP::Simple.new.get("http://ifconfig.io/ua");
LWP::Simple/0.105 Perl6/rakudo
参考URL
Groovy
groovyのコンテナイメージを立ち上げる。
docker run -it --rm groovy:latest
groovy:000> new URL("https://ifconfig.io/ua").getText()
===> Java/1.8.0_212
Common Lisp
Common Lispのコンテナイメージを立ち上げる。
docker run -it lambdasakura/ubuntu-sbcl
HTTPクライアントのDrakmaを入れる。
(ql:quickload :drakma)
(drakma:http-request "http://ifconfig.io/ua")
結果
"Drakma/1.3.11 (SBCL 1.2.6; Linux; 4.4.0-148-generic; http://weitz.de/drakma/)
PHP
apkコマンドでphp7をインストール。
apk add php7
対話シェルを立ち上げる。
php -a
file_get_contentsを実行。UserAgentは返ってこない。
echo(file_get_contents("http://ifconfig.io/ua"));
golang
dockerのイメージを立ち上げる。
docker pull golang
docker run -it golang
vimをインストールする。
apt update && apt upgrade
apt install vim
vimを立ち上げる。
vim client.go
以下の通りvimで保存する。
package main
import (
"fmt"
"net/http"
"io/ioutil"
)
func main() {
url := "https://ifconfig/ua"
resp, _ := http.Get(url)
defer resp.Body.Close()
byteArray, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(byteArray))
}
実行してみる。
go run client.go
結果
Go-http-client/2.0
Rust
rustのdockerコンテナを起動。
cargoを使用する時に、環境変数USERの指定を求められるので、起動時にUSERを指定しておく。
docker pull rust
docker run --rm -e USER=$USER -it rust
vimをインストール
apt update
apt install vim
cargoを使ってプロジェクトを作る。
#適当なディレクトリに移動
cd ~
# 新規プロジェクトをhelloで作る。binは起動可能なファイルのオプション
cargo new hello --bin
# hello ディレクトリに移動
cd hello
srcディレクトリにmain.rsが出来てるのでこれを編集する。
vim src/main.rs
extern crate reqwest;
use std::io;
fn main() {
let mut res = reqwest::get("https://ifconfig.io/ua").unwrap();
res.copy_to(&mut io::stdout()).unwrap();
}
Cargo.tomlを開いて、reqwest="*"
を追加
vim Cargo.toml
[dependencies]
reqwest="*"
実行する。
cargo run
結果
reqwest/0.9.17
- rust - Docker Hub
- docker run(コンテナ作成)する時のオプションあれこれ
- Rustのお勉強 - Cargoを使ってみる
- Rust で素朴に HTTP リクエストを投げる
- Crate reqwest
- 古い記事に騙されないで!hyperじゃなくreqwestを使ってください
Elixir
dockerでElixirをたちあげる。
docker run -it elixir bash
対話モードを起動する。
iex
# start `inets` application.
Application.ensure_all_started(:inets)
# start `ssl` application also
Application.ensure_all_started(:ssl)
:httpc.request(:get, {'https://ifconfig.io/ua', []}, [], [])
Erlang
dockerでErlang対話モードでたちあげる。
docker run -it --rm erlang
アプリケーションを起動
1> application:start(inets).
GETリクエストを実行
2> httpc:request("http://ifconfig.io/ua").
Nim
コンテナを起動
docker pull nimlang/nim
docker run -d -it --name nim_app nimlang/nim /bin/bash
docker exec -it nim_app /bin/bash
vimをインストール
apt-get install vim
cd /var/opt
vim client.nim
import httpclient
const url = "https://ifconfig.io/ua"
var client = newHttpClient()
var response = client.get(url)
echo response.body
nim c -d:ssl -r client.nim
結果
Nim httpclient/0.20.0
参考サイト
Julia
dockerを使って対話モードで起動する
docker run -it --rm julia
julia> using Pkg
julia> Pkg.add("HTTP")
julia> using HTTP
julia> r = HTTP.get("http://ifconfig.io/ua")
julia> println(String(r.body))
参考サイト
Java(JShell)
Javaを試そうと思ったけど、gradleとかmavenとかビルド環境を整えるのは面倒くさそうなので、Java9以降から使えるJShellを使ってみる。
dockerを使って、JShellの対話環境を準備する。
docker run -it openjdk:11 jshell
以下のコマンドをそれぞれ実行する。
jshell>import java.net.http.*
jshell>var client = HttpClient.newHttpClient();
jshell>var request = HttpRequest.newBuilder().uri(URI.create("https://ifconfig.io/ua")).build();
jshell>HttpResponse<String> res = client.send(request,HttpResponse.BodyHandlers.ofString());
jshell>System.out.println(res.body());
結果
Java-http-client/11.0.3
参考サイト
Crystal
dockerを使って対話モードで起動する
docker run -i -t crystallang/crystal /bin/bash
cat << EOS > client.cr
require "http/client"
response = HTTP::Client.get "https://ifconfig.io/ua"
puts(response.body.lines.first)
EOS
crystal client.cr
Racket
dockerを使って対話モードで起動する
docker run -it jackfirth/racket
(require net/url)
(define ua (port->string (get-pure-port (string->url "https://ifconfig.io/ua"))))
(printf "My ua is: ~a" ua)
PowerShell
dockerを使って対話モードで起動する
docker run -it mcr.microsoft.com/powershell:latest
Invoke-WebRequest https://ifconfig.io/ua
StatusCode : 200
StatusDescription : OK
Content : Mozilla/5.0 (Linux; Linux 4.4.0-96-generic #119-Ubuntu SMP Tue Sep 12 14:59:54 UTC 2017; en-US) PowerShell/6.2.3
NodeJS
nodejsをインストール
apk add nodejs
実行ファイルを作成
cat << EOS > client.js
require('http').get('http://ifconfig.io/ua', function(res) {
res.setEncoding('utf8');
res.on('data', function(body) {
console.log(body);
});
});
EOS
ファイルを実行
node client.js
V言語(VLang)
VLangのdockerイメージを立ち上げる。
git clone https://github.com/vlang/v
cd v
docker build -t vlang .
docker run --rm -it vlang:latest
docker上でOpenSSLのライブラリをインストールする
apt-get install libssl-dev
VLangを対話モードで起動する
v
対話モードで実行
>>> import http
>>> resp := http.get('http://ifconfig.io/all.json') or { panic(err) }
>>> println(resp.text)
他の言語もそのうち書く。