ネット通販で楽天やヤフオクなど、いろんなショッピングモールに出品をしているのですが、商品の在庫が一つのモールで売れてしまったときに一括で一つの値をゼロに変えただけで、全モールの同じ商品の在庫がゼロになる仕組みを作りたいのですが、それに対してAPIという技術が必要だと聞きました。調べてみたのですが、いろいろな種類があるみたい?なのとやはり僕の知識が足りため、よくわからないなーっというとこで終わってしまっています。
僕のレベルは、PHPに関して、コードを見ればどこでどういう操作をしているか、それを見ながら、グーグル検索しながら、改造をするくらいはできます。しかし、初めからシステムを作るとなると(例えばメールフォームで情報を入力させて、特定のメアドにその情報を伝える等)どのコードを打ったら特定のメアドにSubmitできるのだろうと悩んでしまうレベルです。
うだうだ言ってますが、ここからが本題です。
APIを学ぶ上で、おそらく僕のレベルだとそのレベルに達していないと思うので、何を学べばAPIを学ぶ基礎ができるのか、もしくはAPIを直接学ぶとしたなら、どの参考書がいいか、またはスクールに通った方がいいのか、意見をくださるとうれしいです。
何か説明で足りないところがあったら追記しますので、みなさんご回答よろしくお願いします!
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% …
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 …
コンソールからtenletコマンドを用いれば、簡単にTCP通信を行うことが出来ます。
※ WindowsVista以降ではデフォルトでは使えないので注意してください
http://so-zou.jp/software/tech/network/tool/teln …
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の理解ももはやすんなりと出来る状態だと思います。次の説明に行きたいのですが…残り文字数が少ないので回答を分けることにします。
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_N …
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!(笑)
回答遅れてすみませんでした!
とてもわかりやすいです!!!!
最高に参考になりました!
といっても「何となく…分かったかも…?」なんですけどね笑
コードを書いてどんどん理解を深めたいと思います!
ありがとうございました!
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-que …
→ クエリストリングの組み立てに役立ちます。部分的にエンコードする場合は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://oshiete.goo.ne.jp/qa/8794273.html
【BASIC認証の必要なAPI】
セキュリティ的に問題点が多いので最近はあまり使われませんが、構造としては上記にIDとPWに関する情報を加えるだけなのでかなりシンプルです。
【OAuth認証の必要なAPI】
以下はTwitterの例です。最近はこれがよく使われるようになってきています。OAuth2.0という仕組みを使えばもうちょっとシンプルに書けますが、RefreshTokenなどの仕組みがかえってややこしいと思うので、ここではOAuth1.1aを使用しています。
http://qiita.com/mpyw/items/b59d3ce03f08be126000
面倒だったらネットに転がってるライブラリを使うのもアリです。
https://github.com/mpyw/TwistOAuth
さっそくの回答ありがとうございます!
様々なリンクや例文など挙げていただいてとてもわかりやすいです!
参考にさせていただきます!
No.1
- 回答日時:
>>商品の在庫が一つのモールで売れてしまったときに一括で一つの値をゼロに変えただけで、全モールの同じ商品の在庫がゼロになる仕組みを作りたいのですが、それに対してAPIという技術が必要だと聞きました。
通常、商品の在庫情報は、データベースに保存してあるものと思います。そこに書き込まれた在庫数を注文を受けるごとに、注文数だけマイナスすると思います。
ですので、いろんなモールのショップが、同じデータベースを参照すれば、特別なことをしなくても、データベースの在庫がゼロになれば、すべてが”在庫無し”と表示されるはずです。
ただし、楽天とヤフオクなど、いろんなショッピングモールに出品しているやり方であれば、それぞれのデータベースは別ですから、あるショップで売れた数字を他のショップに反映させることはできませんね。
たぶん、全体在庫を管理するデータベースを自分で用意して、どこかのショップで売れたら、それを全部のショップに反映させるコードを作成することになるでしょう。
それは、どこかネットを探せば見つかるってものではなく、自分で作成して用意するものです。
もしそういう処理に適したAPIがあったとしても、それを使いこなすには、やはりプログラミングの知識が必要です。
まあ、そういうプログラムが書ける方は、ちいさいころから何年、何十年もかけて独学で勉強してきたとか、情報系大学に入学したとか、まあ、それなりの時間をかけて学んだのだと思います。
もし、時間とお金に余裕があるなら、プログラムを教えてくれるようなスクールを探して学ぶのも良いと思います。
たぶん、素晴らしい絵画を描ける人、あるいは、ピアノやバイオリンのうまい演奏者、空手の黒帯などになるためにかかる時間、努力は人によって大きく差があると思います。
それと同じように、質問者さんが、現在やりたいと思っていることが、自分でプログラムできるようになるには、これらの技術を学ぶのと同じような感じではないかと思います。
回答ありがとうございます!
やっぱり難しいんですね!
でも、まずは独学でやってみてスクールに通ってみたいと思います!
スクールに通うとなると、どこのスクールがAPIを学ぶのに適してますかね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAで質問があります 1 2022/10/19 10:32
- ヤフオク! ヤフオク!の個人情報系はどの程度公開されるのでしょうか? 3 2022/11/22 23:04
- 経済 日刊工業新聞の活用方法について ( ´ー`)y-~~ 1 2023/07/01 10:14
- その他(プログラミング・Web制作) このpythonコードの意味教えて下さい! 2 2022/08/26 00:52
- その他(ネットショッピング・通販・ECサイト) ネットショップを長くされている方 3 2022/04/05 10:41
- ヤフオク! ヤフオクについて ヤフオクで漫画の特典ペーパーを大量に出品されている方がいます。 商品説明を読んだと 3 2022/11/24 00:07
- その他(開発・運用・管理) おんどとりWebStorage APIから温度情報を取得し表示したい 2 2023/08/03 09:53
- その他(プログラミング・Web制作) 次に、楽天のアジャイル就活に参加して、1日で内定を獲得できる。私は大企業に就職できる? 2 2022/04/17 13:38
- 高校 偏差値45未満の底辺の普通科高校(教育困難校)って、本当に存在価値があると思いますか? 5 2022/12/03 16:02
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
割り込み処理について
-
WinSockでの通信プログラムがう...
-
javaでのプログラミングで・・・
-
ソケットプログラミングに関す...
-
recv関数でフリーズしてしまう
-
ソケット通信
-
UDPで受信終了の合図を出して受...
-
UDP通信する時に、相手にどうや...
-
SIPがNATを越えられない理由
-
C#とTCP/IPを利用したサーバー...
-
名前付きパイプの通信ポートに...
-
UDP通信におけるbind関数について
-
Linuxでパケットを発信する際・...
-
Connectエラーが出てしまう・・...
-
TCP/IP通信型プログラムです。 ...
-
RS-232Cのポート番号を知りたい
-
空きポートの取得方法
-
Winsockで接続待ちタイムアウト...
-
ソケットとそれに基づくストリ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
TCP/IP通信時のサーバーからの受信
-
UDP通信におけるbind関数について
-
Winsockで接続待ちタイムアウト...
-
recv関数でフリーズしてしまう
-
VB6のwinsockでconnectできない
-
ソケットのクローズについて
-
UDP通信する時に、相手にどうや...
-
エクセル VBA でのCOMポート...
-
ソケットのrecvの戻り値が0
-
UdpClient 送信元のIPアドレ...
-
Socket通信の0バイト受信について
-
WinSockでの通信プログラムがう...
-
同じLAN内パソコンのIPアドレス...
-
ソケット通信 同じポート番号...
-
VC++でのソケット通信について
-
Connectエラーが出てしまう・・...
-
CreateFile関数でCOMポートが開...
-
Winsockを使わずにVBでSocketを...
-
VB6‥ソケットについて
-
SIPがNATを越えられない理由
おすすめ情報