プロが教える店舗&オフィスのセキュリティ対策術

ネット通販で楽天やヤフオクなど、いろんなショッピングモールに出品をしているのですが、商品の在庫が一つのモールで売れてしまったときに一括で一つの値をゼロに変えただけで、全モールの同じ商品の在庫がゼロになる仕組みを作りたいのですが、それに対してAPIという技術が必要だと聞きました。調べてみたのですが、いろいろな種類があるみたい?なのとやはり僕の知識が足りため、よくわからないなーっというとこで終わってしまっています。

僕のレベルは、PHPに関して、コードを見ればどこでどういう操作をしているか、それを見ながら、グーグル検索しながら、改造をするくらいはできます。しかし、初めからシステムを作るとなると(例えばメールフォームで情報を入力させて、特定のメアドにその情報を伝える等)どのコードを打ったら特定のメアドにSubmitできるのだろうと悩んでしまうレベルです。

うだうだ言ってますが、ここからが本題です。

APIを学ぶ上で、おそらく僕のレベルだとそのレベルに達していないと思うので、何を学べばAPIを学ぶ基礎ができるのか、もしくはAPIを直接学ぶとしたなら、どの参考書がいいか、またはスクールに通った方がいいのか、意見をくださるとうれしいです。

何か説明で足りないところがあったら追記しますので、みなさんご回答よろしくお願いします!

A 回答 (4件)

正直、プログラミングスクールは料金がかかる割に対価が少ないような印象を受けるので、個人的にはあまりおすすめできません。

それよりは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の理解ももはやすんなりと出来る状態だと思います。次の説明に行きたいのですが…残り文字数が少ないので回答を分けることにします。
    • good
    • 0
この回答へのお礼

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

ありがとうございました!

お礼日時:2014/10/31 09:54

さて、ここで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!(笑)
    • good
    • 0
この回答へのお礼

回答遅れてすみませんでした!
とてもわかりやすいです!!!!

最高に参考になりました!
といっても「何となく…分かったかも…?」なんですけどね笑

コードを書いてどんどん理解を深めたいと思います!
ありがとうございました!

お礼日時:2014/10/31 09:52

【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
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/10/20 00:52

>>商品の在庫が一つのモールで売れてしまったときに一括で一つの値をゼロに変えただけで、全モールの同じ商品の在庫がゼロになる仕組みを作りたいのですが、それに対してAPIという技術が必要だと聞きました。



通常、商品の在庫情報は、データベースに保存してあるものと思います。そこに書き込まれた在庫数を注文を受けるごとに、注文数だけマイナスすると思います。
ですので、いろんなモールのショップが、同じデータベースを参照すれば、特別なことをしなくても、データベースの在庫がゼロになれば、すべてが”在庫無し”と表示されるはずです。

ただし、楽天とヤフオクなど、いろんなショッピングモールに出品しているやり方であれば、それぞれのデータベースは別ですから、あるショップで売れた数字を他のショップに反映させることはできませんね。

たぶん、全体在庫を管理するデータベースを自分で用意して、どこかのショップで売れたら、それを全部のショップに反映させるコードを作成することになるでしょう。
それは、どこかネットを探せば見つかるってものではなく、自分で作成して用意するものです。
もしそういう処理に適したAPIがあったとしても、それを使いこなすには、やはりプログラミングの知識が必要です。

まあ、そういうプログラムが書ける方は、ちいさいころから何年、何十年もかけて独学で勉強してきたとか、情報系大学に入学したとか、まあ、それなりの時間をかけて学んだのだと思います。
もし、時間とお金に余裕があるなら、プログラムを教えてくれるようなスクールを探して学ぶのも良いと思います。

たぶん、素晴らしい絵画を描ける人、あるいは、ピアノやバイオリンのうまい演奏者、空手の黒帯などになるためにかかる時間、努力は人によって大きく差があると思います。
それと同じように、質問者さんが、現在やりたいと思っていることが、自分でプログラムできるようになるには、これらの技術を学ぶのと同じような感じではないかと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/10/20 00:55

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!