質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

3669閲覧

web apiの使い方の説明がcurlコマンドのみで、それをlaravelで実装したいがやり方がわからない。

katahaba

総合スコア15

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/11/06 22:45

編集2020/11/07 09:18

https://metadata.co.jp/apis/what-cat/detail.htmlに書かれているこの猫なに猫?apiを自分がlaravel 5.5で開発しているwebアプリから利用したいです。

やったこと

試しに説明の通りユーザー登録してユーザー名とパスワードを使ってコマンドラインで laravelのpublicフォルダの画像
./public/xxxx.jpegでためした所,
以下のようにレスポンスを得ました。
[["Australian_mist",0.6419525146484375],["american_short_hair",0.14048415422439575],["Arabian_Mau",0.13482220470905304],["BritishShortHair",0.07669025659561157],["Scottish_Fold",0.0020108497701585293]]

curl -u xxx:yyy -F "image=@.zzz" http://whatcat.ap.mextractr.net/api_query xxx : 「この猫なに猫?」のユーザ名 yyy : 「この猫なに猫?」のユーザパスワード zzz : 識別したい画像のファイル名

やりたいこと

これを利用してaws s3 にアップロードされた画像毎に何の猫か判定して表示するというアプリを作りたいです。 

疑問点:
1、クエリを送る時にユーザーネームやパスワードをどういう表記で(なんというキーで?)送ったらよいか

2、画像の場所がs3のバケットないにあるとき(url表記の場合)コマンドラインでもうまくいかなかったがどうしたら良いか

叩いたコマンド
curl -u (登録したusername):(登録したpassword) -F “image=@(アマゾンs3にある画像のurl)” http://whatcat.ap.mextractr.net/api_query
エラー
Warning: setting file
Warning: https://バケット名.s3.amazonaws.com/inputs/ファイル名” failed!
curl: (26) read function returned funny value

3、curlコマンドをどのようにlarvel上で再現すれば良いかわかりません。
https://note.com/kawa1228/n/n55b3cfcb543c
こちらの記事でなんとなく書き方はわかったのですがguzzleをつかってもっと簡単に書きたくもあります。

以下にすごく適当に書いてみたコードがありますが当然うまくいきませんでした。

php

1$client = new \GuzzleHttp\Client(); 2$url = "http://whatcat.ap.mextractr.net/api_query"; 3$params = [ 4 'username' => env('whatcat_username'), 5 'passowrd' => env('whatcat_password'), 6 'image' => './public/download.jpg' 7]; 8$response = $client->request('POST', $url, $params); 9 dd($response);

エラー
GuzzleHttp \ Exception \ ClientException (403)
Client error: POST http://whatcat.ap.mextractr.net/api_query resulted in a 403 FORBIDDEN response: {"detail":"認証情報が含まれていません。"}

すごく初心者なのでそれをふまえて回答いただけると助かります。

上記のhttps://note.com/kawa1228/n/n55b3cfcb543cを参考にさらにやってみた

php

1 2$image_url='./public/download.jpeg'; 3$base = "http://whatcat.ap.mextractr.net/api_query"; 4// $param = "?username=env('whatcat_username')&passowrd=env('whatcat_password')&image=$image_url"; 5$param = "?username=env('whatcat_username')&passowrd=env('whatcat_password')&image='@'.$image_url"; 6$url = $base . $param; 7$headers = []; 8$method='GET'; 9 10 11$curl = curl_init(); 12curl_setopt($curl, CURLOPT_URL, $url); 13curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method); 14curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 15curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 16curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); 17 18 19$responseJsonText = curl_exec($curl); 20$body = json_decode($responseJsonText , true); 21 22$httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); 23curl_close($curl); // curlの処理終わり 24 25$result = []; 26$result['http_code'] = $httpCode; 27$result['body'] = $body; 28 29return $result; 30 31dd($result);

結果表示
{"http_code":403,"body":{"detail":"\u8a8d\u8a3c\u60c5\u5831\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u305b\u3093\u3002"}}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ユーザ認証用のカールオプションCURLOPT_USERPWDがあるようなので、ユーザ名とパスワードを、そちらで指定してみてください。

php

1$USERNAME = "whatcat_username"; 2$PASSWORD = "whatcat_password"; 3 4curl_setopt($curl, CURLOPT_USERPWD, "$USERNAME:$PASSWORD");

cURLでベーシック認証

投稿2020/11/07 07:46

YT0014

総合スコア1750

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katahaba

2020/11/07 21:23 編集

お答えのようにやってみました。画像の部分がわからなかったので https://www.php.net/manual/ja/curlfile.construct.phpを参考に書いてみました。 $USERNAME = env('whatcat_username'); $PASSWORD = env('whatcat_password'); $image_path = public_path('/download.jpeg'); //dd($image_path)したら "/home/ec2-user/environment/nani-neco/public/download.jpeg" となっていましたので多分合っていると思います。 $pathinfo = pathinfo($image_path); //これでファイルのパスとMIME種類とファイル名の配列が得られるらしい $curl = curl_init("http://whatcat.ap.mextractr.net/api_query"); $cfile = array('file' => new \CURLFile($image_path, $pathinfo['extension'], $pathinfo['filename']) ); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $cfile); curl_setopt($curl, CURLOPT_USERPWD, "$USERNAME:$PASSWORD"); $response = curl_exec($curl); $body = json_decode($response, true); $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); curl_close($curl); // curlの処理終わり $result = []; $result['http_code'] = $httpCode; $result['body'] = $body; dd($result); return $result; エラー内容が変化して、 array:2 [▼ "http_code" => 0 "body" => null というものがかえってきて認証はうまくいっているようですが、レスポンス取得は失敗している様子です。 どこを変えたら良いでしょうか?
katahaba

2020/11/08 16:19

ありがとうございました。とりあえず無事デプロイできました。
guest

0

自己解決

投稿2020/11/07 22:17

katahaba

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問