LoginSignup
7
5

More than 3 years have passed since last update.

Play with Dockerを使って、色んなプログラム言語でhttp通信してみる

Last updated at Posted at 2019-05-19

以前、
UserAgentからOS/ブラウザなどの調べかたのまとめ
で色んなプログラミング言語から、HttpRequestを試す際、環境の準備にPlay with Dockerを使うのが便利だったので、使いかたを乗せておく。

Play with Dockerとは

playwithdocker.jpg

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

下記の内容を保存する。

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で作成してファイルを保存する。

getua.d
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で保存する。

client.go
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
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
Cargo.toml
[dependencies]
reqwest="*"

実行する。

cargo run

結果

reqwest/0.9.17

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
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)

他の言語もそのうち書く。

7
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5