• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:APIを学ぶのに必要な事)

APIを学ぶのに必要な事

このQ&Aのポイント
  • APIを学ぶ上での基礎を身につけるためには、参考書やスクールでの学習がおすすめです。
  • APIを利用したシステムを作成する際は、PHPの知識だけでは限界がありますので、他のプログラミング言語やフレームワークを学ぶことも重要です。
  • APIを利用する際は、ドキュメントの読み方やAPIキーの取得方法、リクエストとレスポンスの処理などについても学んでおくと良いでしょう。

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.3

正直、プログラミングスクールは料金がかかる割に対価が少ないような印象を受けるので、個人的にはあまりおすすめできません。それよりはGoogleを主体的に利用して学習していく方法のほうが無料で済むのでありがたいと思います。 多分APIに対してとっかかりにくいのは、API以前にネットワーク通信技術の背景が分かっていないからだと思います。ヒントとなるように順を追って掲載していきますので、よかったら参考にしてください。 まず、「プロトコル」「OSI参照モデル」「TCP/IP」を順に検索してみてください。 【要点: 用語整理】 ・プロトコルは通信のための取り決め ・OSI参照モデルはプロトコルを理論的に階層化したもの ・TCP/IPはOSI参照モデルを一部採用しながら現実に実装したもの TCP/IPのWikipediaのページを開いてみてください。 http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%83%BB%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E3%83%BB%E3%82%B9%E3%82%A4%E3%83%BC%E3%83%88 1. リンク この部分はハードウェア屋さんの仕事なので、プログラマが直接触れることは少ないです。 2. インターネット IPの意味だけ把握していればOKです。単純に「インターネット上の住所」という程度で構いません。 3. トランスポート ※重要 通信相手のIPを指定して実際に通信を行う層です。「実際にどうやって通信しているか」を掘り下げる最下の層はここで構いません。これ以上深いところに掘り下げるとハードウェアが関連してくるので、こことこれより上の層を理解していれば十分です。「TCP」と「UDP」が非常によく使われます。UDPは音声通話など「多少欠損してもいいから速度第一」という目的、TCPは正確性を追求するときに使われます。大部分の通信はTCPで行われているのが現状です。 4. アプリケーション ※重要 TCPやUDPを使えば、相手にテキストデータ・画像データ・映像データなど、どんなデータでも送信することが可能です。しかし、「ここまではファイル名などの情報」「ここからは実際のデータ」といった線引きが為されている必要があるのは言うまでもないでしょう。それを行うのがこの層です。「HTTP」や「FTP」などが有名です。 実際にTCPを使っていく前に、1点補足しておきます。ルータなどのハードウェア機器に関して「ポート」などの名前を聞いたことはあると思いますが、これは内外を繋ぐ出入口のことを指します。出入り口はトランスポート層のプロトコルごとに65536個ずつ割り振られています。つまり、「TCPポートで0~65535」「UDPポートで0~65535」というように存在しているということです。実際に番号を指定しないと通信を行うことが出来ません。また、既に使用されているポートは別のアプリからは使うことが出来ません。 【要点: TCP通信の実現に必要なもの(UDP通信でも同様)】 ・IPアドレス(またはホスト名)の指定 ・ポート番号の指定 なお、よく使われるポートはアプリケーション層のプロトコルごとに慣用的に決められています。ポートの指定を省略したときはこれがデフォルトとして使われることが多いです。 HTTP → 80 HTTPS → 443 さて、実際にTCPを使ってみましょう。試しに以下のページを取得してみます。 A very simple webpage http://csb.stanford.edu/class/public/pages/sykes_webdesign/05_simple.html コンソールからtenletコマンドを用いれば、簡単にTCP通信を行うことが出来ます。 ※ WindowsVista以降ではデフォルトでは使えないので注意してください http://so-zou.jp/software/tech/network/tool/telnet/ 1. 「telnet」でtelnetクライアントを起動。 2. 「open csb.stanford.edu 80」でTCP接続。 3. 「GET /class/public/pages/sykes_webdesign/05_simple.html HTTP/1.0」と入力して改行。 4. 「Host: csb.stanford.edu」と入力して改行。 5. 何も入力していない状態で改行。 すると、コンソールにダーッとHTMLソースが流れ込んでくると思います。でも、それより前に何やらメタ情報のようなものもついていますよね?これは「レスポンスヘッダー」と呼ばれるものです。逆にあなたが最初にステップ3,4,5で送信したものは「リクエストヘッダー」と呼ばれます。詳しくは以下のリンク先にまとめられているので是非読んでください。 HTTP入門 http://www.tohoho-web.com/ex/http.htm Webブラウザは日頃何をやっているかというと、先ほどの通信を行い、「レスポンスヘッダー」の情報を裏で解釈しつつ、「レスポンスボディ」のHTMLをもとに画面にテキストや画像を表示しているだけのことです。 --------------------------------------------- ~閑話休題~ PHPはさまざまなレベルでの通信に対応しています。 [TCPを直接叩く低レベル通信] <?php $fp = stream_socket_client('tcp://www.example.com:80'); fwrite($fp, implode("\r\n", [  "GET / HTTP/1.0",  "Host: example.com",  "",  "" ])); $resopnse = stream_get_contents($fp); ※ レスポンスヘッダが含まれます。ヘッダとボディを分割したいときは以下のコードを使ってください。 list($header, $body) = explode("\r\n\r\n", $response, 2); ※ fgetsでループする人もいますがstream_get_contentsで十分です。 ※ 文字列として得たい場合はstream_get_contents、そのまま出力するときはfpassthruを使ってください。 ※ stream_socket_clientの代わりにfsockopenを使うことも出来ます。 [HTTPを利用する高レベル通信 (file_get_contents編)] <?php $resopnse = file_get_contents('http://www.example.com:80/'); ※ レスポンスヘッダは含まれません。その代わり、レスポンスヘッダの配列は $http_response_header としてその場に定義されます。 ※ 文字列として得たい場合はfile_get_contents、そのまま出力するときはreadfileを使ってください。 [HTTPを利用する高レベル通信 (fopen編)] <?php $fp= fopen('http://www.example.com:80/', 'r'); $resopnse = stream_get_contents($fp); ※ レスポンスヘッダは含まれません。その代わり、レスポンスヘッダの配列は $http_response_header としてその場に定義されます。 ※ 文字列として得たい場合はstream_get_contents、そのまま出力するときはfpassthruを使ってください。 [HTTPを利用する高レベル通信 (cURL編)] <?php $ch = curl_init(); curl_setopt_array($ch, [  CURLOPT_URL => 'http://www.example.com:80/',  CURLOPT_RETURNTRANSFER => true, ]); $resopnse = curl_exec($ch); ※ レスポンスヘッダは含まれません。レスポンスヘッダを取得するにはちょっとした工夫が必要ですが、ここでは省略します。 --------------------------------------------- さて、ここまでちゃんと理解できていればAPIの理解ももはやすんなりと出来る状態だと思います。次の説明に行きたいのですが…残り文字数が少ないので回答を分けることにします。

soccerrlove
質問者

お礼

ベストアンサーはNo.3とNo.4二つあるのですが、No.3のほうにしておきます! ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

noname#244856
noname#244856
回答No.4

さて、ここでAPIの意味についてもう一度振り返ってみましょう。 API http://e-words.jp/w/API.html APIには幅広い意味がありますが、これを「Web API」というようにすると一気に定義が狭まります。 WebAPI http://e-words.jp/w/Web20API.html その中でもとりわけシンプルに、具体的には普段HTMLを表示するときにリクエストを送るのと同じような形式で実現できるのが「REST API」と呼ばれるものです。 REST http://e-words.jp/w/REST.html 簡単に言えば、HTTP通信における「レスポンスボディ」の部分に、HTMLの代わりに何かプログラムから利用しやすいようなフォーマットのデータを置いてあげるだけのことです。もちろんHTMLをプログラムから解析することも可能ではありますが、お世辞にも効率がいいとは言えないので、プログラムからの利用に特化したものがあってもいいとは思いますよね。それで最近頻繁に利用されているのがJSONなのです。もとはJavaScriptだけのための存在でしたが、その有用性が評価され、さまざまな目的に用いられるようになってきています。 JSON http://ja.wikipedia.org/wiki/JavaScript_Object_Notation PHPでは以下のような関数を使えばPHP内での構造に相互変換することが出来ます。 json_decode http://php.net/manual/ja/function.json-decode.php json_encode http://php.net/manual/ja/function.json-encode.php 蛇足: json_decodeの第2引数にTrueを渡すかどうかの議論↓ http://d.hatena.ne.jp/ariteku/20120415/p2 --------------------------------------- さて、ここまで一気に説明してきましたが、どれくらいついてこられましたか? 「バッチリ」 → 嬉しい限りです。 「何となく…分かったかも…?」 → 実際に自分でコードを書いてみるとどんどん理解が深まってくると思います。 「全然わからない!」 → プログラミングスクールへGO!(笑)

soccerrlove
質問者

お礼

回答遅れてすみませんでした! とてもわかりやすいです!!!! 最高に参考になりました! といっても「何となく…分かったかも…?」なんですけどね笑 コードを書いてどんどん理解を深めたいと思います! ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。
noname#244856
noname#244856
回答No.2

【API利用に必要な関数】 PHPから外部にリクエストを送信するのによく用いられるモジュールとしてcURL関数群があります。速度的にもエラー処理的にも有利なので、是非これを使う方法を覚えていきましょう。Linuxでcurlコマンドを使ったことがあれば馴染み深いものだと思います。 cURL関数 http://php.net/manual/ja/ref.curl.php 【cURLによるリクエストの基本】 $ch = curl_init(); curl_setopt_array($ch, [連想配列でオプションを指定]); $response = curl_exec($ch); 【よく利用されるオプション】 CURLOPT_URL → 取得先のURLを指定します。curl_initの第1引数として設定することも出来ますが、curl_setopt_arrayでまとめて設定する場合はこちらを使ったほうが見やすくなるでしょう。 CURLOPT_RETURNTRANSFER → これをTrueに設定しないと curl_exec が値を返す代わりにその場で出力しています。設定必須です。 CURLOPT_SSL_VERIFYPEER → https:// を利用する際、オレオレ証明書に遭遇するとこれが False に設定されていないとエラーになります。 (CURLOPT_COOKIEJAR) → 空文字列を指定すると、メモリ上でCookieの管理を全部自動的にやってくれます。APIを利用する際にはあまり関係ないかもしれませんが、APIが提供されていないサイトでスクレイピングを実行するときには頻繁に使います。 (CURLOPT_FOLLOWLOCATION) → Trueを設定すると、リダイレクトの追跡を勝手にやってくれます。APIを利用する際にはあまり関係ないかもしれませんが、APIが提供されていないサイトでスクレイピングを実行するときには頻繁に使います。 CURLOPT_POST → Trueに設定すると、メソッドをPOSTに切り替えます。 CURLOPT_HTTPGET → Trueに設定すると、CURLOPT_POSTでPOSTに切り替えられた状態からデフォルトのGETに戻します。 CURLOPT_POSTFIELDS → POSTの際に利用されます。文字列を渡すとapplication/x-www-form-urlencoded、連想配列を渡すとmultipart/form-dataで送信されます。後者はファイルアップロードで使われます。なお、GETでパラメータを送信したい場合は、ここに指定するのではなくhttp_build_queryに通したものをCURLOPT_URLでクエリストリングとして付加するようにしてください。 【cURL関数以外でよく利用される関数】 http_build_query http://php.net/manual/ja/function.http-build-query.php → クエリストリングの組み立てに役立ちます。部分的にエンコードする場合はurlencodeでも十分ですが、http_build_queryの方が利用価値はあるはずです。 【レスポンスの形式】 最近はJSONが主流です。その場合にはjson_decode関数に通すとJavaScriptのJSON.parseに渡したような感じでデコードしてくれます。PHPにおいては、 [ ] は配列、{ } はstdClassオブジェクトとしてデコードされます。オブジェクトプロパティに対するアクセスは「->」演算子で実現できます。存在しない可能性があるものに関しては必ず isset で定義されているかどうかの確認を行ってください。 json_decode http://php.net/manual/ja/function.json-decode.php XMLなどの場合もありますが、ここではJSONだけを紹介してあとは省略することにします。 【認証不要で取得するAPI】 これが一番敷居が低いです。以下の回答でサンプルを記載しています。 http://okwave.jp/qa/q8794273.html 【BASIC認証の必要なAPI】 セキュリティ的に問題点が多いので最近はあまり使われませんが、構造としては上記にIDとPWに関する情報を加えるだけなのでかなりシンプルです。 【OAuth認証の必要なAPI】 以下はTwitterの例です。最近はこれがよく使われるようになってきています。OAuth2.0という仕組みを使えばもうちょっとシンプルに書けますが、RefreshTokenなどの仕組みがかえってややこしいと思うので、ここではOAuth1.1aを使用しています。 http://qiita.com/mpyw/items/b59d3ce03f08be126000 面倒だったらネットに転がってるライブラリを使うのもアリです。 https://github.com/mpyw/TwistOAuth

soccerrlove
質問者

お礼

さっそくの回答ありがとうございます! 様々なリンクや例文など挙げていただいてとてもわかりやすいです! 参考にさせていただきます!

全文を見る
すると、全ての回答が全文表示されます。
  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.1

>>商品の在庫が一つのモールで売れてしまったときに一括で一つの値をゼロに変えただけで、全モールの同じ商品の在庫がゼロになる仕組みを作りたいのですが、それに対してAPIという技術が必要だと聞きました。 通常、商品の在庫情報は、データベースに保存してあるものと思います。そこに書き込まれた在庫数を注文を受けるごとに、注文数だけマイナスすると思います。 ですので、いろんなモールのショップが、同じデータベースを参照すれば、特別なことをしなくても、データベースの在庫がゼロになれば、すべてが”在庫無し”と表示されるはずです。 ただし、楽天とヤフオクなど、いろんなショッピングモールに出品しているやり方であれば、それぞれのデータベースは別ですから、あるショップで売れた数字を他のショップに反映させることはできませんね。 たぶん、全体在庫を管理するデータベースを自分で用意して、どこかのショップで売れたら、それを全部のショップに反映させるコードを作成することになるでしょう。 それは、どこかネットを探せば見つかるってものではなく、自分で作成して用意するものです。 もしそういう処理に適したAPIがあったとしても、それを使いこなすには、やはりプログラミングの知識が必要です。 まあ、そういうプログラムが書ける方は、ちいさいころから何年、何十年もかけて独学で勉強してきたとか、情報系大学に入学したとか、まあ、それなりの時間をかけて学んだのだと思います。 もし、時間とお金に余裕があるなら、プログラムを教えてくれるようなスクールを探して学ぶのも良いと思います。 たぶん、素晴らしい絵画を描ける人、あるいは、ピアノやバイオリンのうまい演奏者、空手の黒帯などになるためにかかる時間、努力は人によって大きく差があると思います。 それと同じように、質問者さんが、現在やりたいと思っていることが、自分でプログラムできるようになるには、これらの技術を学ぶのと同じような感じではないかと思います。

soccerrlove
質問者

お礼

回答ありがとうございます! やっぱり難しいんですね! でも、まずは独学でやってみてスクールに通ってみたいと思います! スクールに通うとなると、どこのスクールがAPIを学ぶのに適してますかね?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 在庫更新APIなどの情報を中に入れる系のAPI

    在庫更新などのAPIなどはどのタイミングで在庫が更新されるのでしょうか? 例えば、楽天商品データをホームページに表示させたい場合は、リクエストを送って、それに対するレスポンスをひもづけて、表示させると思うのですが(合ってなかったら私の勉強不足です)、在庫更新などの場合は情報をリクエストで送ることで、在庫が更新される?のでしょうか? 在庫が更新されるのはどうやってされているのかが知りたいです。 回答よろしくお願いします!

    • ベストアンサー
    • PHP
  • 楽天APIを利用したい

    特定の質問になってしまうのですが、 楽天のAPIを利用しhttp://www.pillow.co.jp/3works/ec/imakore.htm のような仕組みを作りたいと考えております。 商品の内容、注文日、時刻、都道府県の情報はCSVファイルとしてあるとして、上記のようなHTMLファイルはどのようにして作れますでしょうか。

    • ベストアンサー
    • AJAX
  • ポケモン プラチナ BW 改造 ポケシフター

    ポケモンについてです (1)プラチナでコードフリークを使う (2)プラチナでレベル100のポケモンを作る (3)ブラックでポケシフターを使う (4)プラチナの(2)のポケモン(レベル100)をブラックに送る ここからが本題です プラチナで改造したポケモンをブラックに送ります その改造したポケモンをブラックでwi-fi対戦や交換しても大丈夫なのでしょうか?

  • Accessで在庫管理する時の在庫数の出し方

    在庫管理をaccessで行おうとしています。 在庫数の出し方が分かりません。 =DLookUp("[在庫数]","[T_発注]","助成物コード='" & [Forms]![F_受注]![助成物コード] & "'")-nz([数量]) とすると、それらしい数は表示されるのですが、次のレコードで同じ商品(助成物コード)を指定すると、前のレコードの在庫と同じ数になってしまいます。 =DLookUp("[在庫数]","[T_発注]","助成物コード='" & [Forms]![F_受注]![助成物コード] & "'")-nz([数量]) した結果を次の『=DLookUp("[在庫数]"』の在庫数に引き継いでもらいたいのですが、どうすれば良いか分かりません。 上記で『助成物コード』が商品コードで、 『数量』が受注数です。 他にどんな情報があれば良いか分かりませんので、不足している情報があればご指摘下さい。

  • Accessの条件に合致した集計と抽出について

    条件に合致した場合の集計と抽出について教えてください。 テーブルで、 商品コード 在庫数 滞留日数 あ001    5    100 あ001    1    50 い002    10   20 とあり、 商品コードが重複した場合は、在庫数を合計し、滞留日数は値が大きい方を表示、 商品コードの重複がない場合はそのまま表示 という条件を設定し、 商品コード 在庫数 滞留日数 あ001    6    100 い002    10   20 という結果を表示させるにはどのような関数を組んだらよいでしょうか? 当方初心者ですので、不足な情報等ございましたらご指摘ください。 よろしくお願いいたします。

  • MicroSoft Access2000で複数のテーブルの中にある必要

    MicroSoft Access2000で複数のテーブルの中にある必要なデーター選んで一つ表にまとめる方法を教えてください。 ・テーブル1は商品名、商品コード、棚番号のデーター ・テーブル2は商品名、単価 ・テーブル3は商品名、在庫数 これら全てのデーターを新しいテーブルに一つの表するにはどのようにしたら良いのでしょうか? Accessは使ったことが無く初めて目にする超初心者の私にでも分かる位のレベルで教えてください。 (クリエとかテーブル等の役割や意味も分からないです) 他に頼れる人はいないので自分自身で何とかするしかありません。

  • accessの使い方

    関連書籍を読みアクセスを勉強しているのですが、 いまいちよくわからないことがあります。 「商品情報」、「7月商品」というテーブルを作り、在庫管理をしたいと思っています。 「商品情報」には商品コード、仕入先1、単価1、仕入先2、単価2があり、 「7月商品」には商品コード、仕入先、単価、仕入数、在庫があります。 「7月商品」の入力用フォームを作り、商品コードはコンボボックスを使って「商品情報」の商品コードから選べるようになっています。 「7月商品」で商品コードを選んだ時に、「7月商品」の仕入先をその商品コードの仕入先1,仕入先2から選べるようにしたいのですがどうしたらいいでしょうか? また選んだ仕入先の単価が適用されるようにしたいと思います。 <例> 「商品情報」 001,商品1,A社,100,B社,110 002,商品2,C社,200,D社,210 「7月商品」の入力フォームで商品コードをコンボボックスの中から001を選ぶと、(ここまではできました) 仕入先にA社かB社が選べ、 A社を選ぶと単価に100が、B社を選ぶと単価に110が適用される。

  • 商品テーブルと2つの在庫テーブルの結合ができない

    商品のデータベースがあるんですが、一つの商品テーブルに複数の店舗の商品をまとめて登録しています。在庫数は店舗別のテーブルで分けているのですが、これをSQLで商品コードで結合ができません。 仮に商品がA、B、Cと登録されていたとして、店舗1にはAとBの商品があるため2つの在庫数を設定しており、店舗2にはBとCの商品があるため2つの在庫数を設定しています。 つまり片方のみの商品もあれば両方に存在する商品があります。 このときにSQLで商品情報を取得する場合に、結合したいのですが結果が0件となり上手く結合ができません。 商品コードがBのときにSELECT文で両店舗の在庫数を同時に取得したいし、AやCではそれぞれの店舗在庫を取得したいのですが、何か良い方法はないものでしょうか?

    • ベストアンサー
    • MySQL
  • EXCEL 名前を特定しないで在庫増減する方法

    こんにちは。EXCELで在庫表を動かす関数とマクロを組んでおりますが、つまずいてしまいました。 どうか皆様の知恵をお貸し願えたらと思います。 現在、(画像上)のように、JANコードでまとめた店別の商品在庫表があります。 各店から、在庫の+-をあらわすCSVデータ(画像中央)が送られてくるのですが、これをEXCELに取り込み、JANコードをキーにして、+-の数値を在庫表に反映させ、(画像下)のようにしたいと思っています。 ちなみに「数量」の項目はいつも必ず1です。 「増減」で+-をあらわしています。 (りんごが3つ減ったら、増減「-」数量「3」ではなく、「-」「1」が3つ並んでデータに表示されます) ですが、ここで問題が出てきてしまいました。 サンプル画像は商品もJANコードも3種類しかありませんが、実際には1000種類以上の商品があり、在庫表のデータベースももっと縦に長くなっています。 商品の数が少なくて、売れるものも毎日決まっていれば、VLOOKUPやCOUNTIF関数で「りんごのマイナスは何個」と指定して数量を抜き出すことができますが、毎日ちがう商品のデータが何種類も入ってくるため、「りんご」「みかん」といちいち指定して抜き出す手間がかけられません。 JANコードを軸にして、毎回ほぼランダム同然に送られてくる商品の在庫数を一度に表に変換できないものでしょうか。 いろいろ関数の組み合わせや作業プロセスを考えてみましたが、多くの関数は、特定の"名前"を指定して、数を抜き出すものなので、なかなかうまくいかずに困っています。 また大変恐縮ですが、マクロでワンタッチでできるようにしたいと思っているので、良いコードがあれば教えていただきたいと思っています。 どうかよろしくお願い致します。

  • ネットモールでの特定商取引の表示について

    ネットモールを現在するため、現在準備中です。 私たちは決済を代行し、商品の出品、発送は直接出品者から行ってもらう形態です。 こういった場合、特定商取引に関する表示は、出品者ごとに表示してもらう必要があるのでしょうか。 それとも、私たちネットモール運営者の情報だけでよいのでしょうか。 ご教示お願いいたします。