ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

ダメなエンジニアには解けないパズル!?RESTAPIとcurlコマンドについて

はじめに

突然「rest apiおもろいスネ!興味ありますわ」というLINEを送ってきた同期氏、確かにRESTAPIってよく聞くけど何なのかイマイチ曖昧にしか分かってないわーちゃんと理解しないとなーなんて返してると、はてなで見つけたこの記事がきっかけだそうだ。

tango-ruby.hatenablog.com

tango-ruby.hatenablog.com

ダメなエンジニアには解けないパズル。なんのこっちゃと思うが、curlを1発叩いてみれば分かる、これはハマる。笑 そういう僕も1問目は数分で解けたものの、2問目は合計1時間以上かけて解くことができた。

以下が問題への直のリンク。

Challenge

Challenge2

出題者のブログにも書いてあるが、問題のページへ飛ぶと、「Please call my APIs」と「RESTful」というヒントがあるだけ。どうしたもんかと思ったものの、APIっつーんだからcurl叩いてみるかー、といったところからはじまりますね。

curlとは

wikipediaをソース(参考文献)にするな、と言われた大学1年生の頃を思い出しながらwikipedia貼りますね。

cURL - Wikipedia

curl(カール)って言うから何カールコマンドっておじさんかよって思ってたけど「command line url」なんですね気づいたとき感動したーと思ったら違うっぽい。

cURLとは|client for URL - 意味/解説/説明/定義 : IT用語辞典

client for URLだとさ。

これ、httpプロトコル用だと思ってたけど、そもそもはURLベースでコマンドやデータを送るコマンドで、http以外にftpsmtppop3ldap、さらにそれらのセキュアなもの(SSL/TLS)までたくさんサポートしているようです。知らなかった。

まぁよく考えたらurl内のhttp://ってhttpプロトコル使うよーって意味なわけで、ftp://** もURLだしね。。。あはは。。。

使い方は簡単、curl URL と入力すると、このURLに対してhttpのGETが実行されます。ウェブブラウザのアドレスバーに打ち込んだときと同じですね。

実際に上記の問題のトップに対してcurlコマンドを実行してみます。

MacBook-Air:~ take$ curl http://challenge-your-limits.herokuapp.com/

以下のレスポンスが得られます。ページのhtmlタグですね。

<!DOCTYPE html>
<html>
<head>
  <title>Challenge</title>
  <link rel="stylesheet" media="all" href="/assets/application-edc767c4f0fcfa4ad8c2f7e8465c4ddf1f23e519e2b7dcf3f7befc780cddbd37.css" data-turbolinks-track="true" />
  <script src="/assets/application-6b71b9943dadf9c965554f94a9c5053dc16e4b270c87fc19cc6cfe234ec313a6.js" data-turbolinks-track="true"></script>
  <meta name="csrf-param" content="authenticity_token" />
<meta name="csrf-token" content="IoyHLSgIr56AZ35UyA6lDccmrhsoe41hnwNG8wy4yPx5CH73ETNb5hbJQpzqd38CVyEvYzUmzXwyQXcgwGcnkw==" />
(省略)

-X でhttpメソッドを指定できるので、GET以外も使えるし、-dでパラメータをのせることもできます。

詳細はmanページへどうぞ。

cURL - How To Use (マニュアルページ日本語訳)

RESTfulとは

REST APIとは? - API設計のポイント

RESTfulとは

以上2つのサイトが非常に参考になった。

REST(Representational State Transfer)とはプロトコルでもなく、設計思想のようですね。そしてそれがHTTPに則って設計されているから、webで使われている。

大きな特徴としては

  • リソースがURLで一意にアクセスできること
  • ステートレスであること(サーバがクライアントの状態を保持しない)

でしょうね。そしてリソースに対しての操作はhttpメソッドのGET、PUT、POST、DELETEを用いる。シンプルで分かりやすいですね。

仕事でOpenStackのAPI(OpenStack API Documentation)をよく叩いているのでweb api自体は馴染みがありました。

上の2つで参考書籍にあがってたこの本は読みます。

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

まとめ

ネタバレになるから書けないんだけど、2問目で出てきた技術についてまとめたい。(笑)忘れた頃に別記事でしれーっと振り返ろうと思います。

こういう問題を作れるのはすごいし、やっぱりウィットが効いててクスっとなってしまう言い回しにはニヤニヤしてしまいますね。そんなエンジニアになりたい。

おそらくしばらくはWebサービス、もしくはWebAPIについて関わっていくことになるのでこれを機にしっかり勉強して、今後はRESTfulなAPIを自分で設計したいと思います。

追記:コメントが紹介されました

問題が公開されたのは12/28、実際に問題を解いたのは12/29。そして12/31にチャレンジした人が300に超えたということで作者がコメントバックしています。

tango-ruby.hatenablog.com

あああめっちゃ時間かかったけど出来た!1回目に比べて凝ってて解きごたえありました。 - takeshe12

時間をかけてお付き合いいただいて、ありがとうございます。これからもたとえ時間がかかっても解きごたえがあるパズルを目指します。

300件あるうち、運良く選ばれたみたいでコメントバックいただけました。嬉しい。次回もあるみたいなので楽しみにして待ってます。