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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

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

Q&A

0回答

1666閲覧

APIに接続できない

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

API

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

0グッド

2クリップ

投稿2021/04/22 11:18

前提・実現したいこと

PHPで、APIに接続を試しています。
ローカル環境(Windows10、XAMMP)で試したところ正常に接続できたのですが、
サーバー(ロリポップ)にあげたところ接続できません。

発生している問題・エラーメッセージ

ローカル環境では正常に動作し、APIから値の取得ができました。
サーバー環境ではトークンの取得までできたのですが、その後の動作で401エラーが出ました。

{"errorType":"string","errorMessage":"{"status":401,"message":"Unauthorized."}","trace":[]}

該当のソースコード

php

1<?php 2 3//トークンの取得 4 5$ch = curl_init(); 6 7curl_setopt($ch, CURLOPT_URL, 'https://エンドポイント/get_token'); 8curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 9curl_setopt($ch, CURLOPT_POST, 1); 10curl_setopt($ch, CURLOPT_POSTFIELDS, {"userName": "ユーザー名", "password": "パスワード"} ); 11 12$headers = array(); 13$headers[] = 'Content-Type: application/json'; 14curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 15 16$result = curl_exec($ch); 17if (curl_errno($ch)) { 18 echo 'Error:' . curl_error($ch); 19} 20curl_close($ch); 21 22$json_arr = json_decode($result,true); 23$token = $json_arr["token"]; 24 25//ここまで(トークンの取得)まではできていることを確認済み 26 27 28//APIキー及び取得したトークンを用い、画像をAPIに送信 29 30$file_name = './image.jpg'; 31$data = base64_encode(file_get_contents($file_name)); 32$data = array( 33 'image' => $data 34); 35 36$post = json_encode($data); 37 38 39 40$ch = curl_init(); 41 42curl_setopt($ch, CURLOPT_URL, 'https://エンドポイント/classify'); 43curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 44curl_setopt($ch, CURLOPT_POST, 1); 45curl_setopt($ch, CURLOPT_POSTFIELDS, $post); 46 47$headers = array(); 48$headers[] = 'Content-Type:application/json'; 49$headers[] = 'X-Api-Key:APIキー'; 50$headers[] = 'Authorization:'. $token; 51curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 52 53$result = curl_exec($ch); 54if (curl_errno($ch)) { 55 echo 'Error:' . curl_error($ch); 56} 57curl_close($ch); 58 59 60$json_arr = json_decode($result,true); 61 62if ($json_arr === NULL) { 63 echo "データがありません"; 64 return; 65}else{ 66 67echo $result; 68 69} 70 71

試したこと

・ローカル環境ではShift-Jisだったので、Utf-8に返還した。
・パーミッションをサーバー指定に変更した。
・海外アタックガードなどすべて無効にした。

補足情報

利用したいAPIはAWS上にあります。
ネットを参照しながらコピペで作成しかできない初心者です。
お手数をかけますがよろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/04/22 11:35

回答ありがとうございます。 現在PHP(Litespeed版)を利用しているため、PHP設定の変更ができませんでした。
退会済みユーザー

退会済みユーザー

2021/04/22 11:37

ユーザーページ(とかコントロールパネル?)とかで、エラーログをチェックする方法が用意されていないか、マニュアルをあたってみてください。
退会済みユーザー

退会済みユーザー

2021/04/22 12:09

ロリポップでエラーログを確認できるよう検索しましたが、該当する情報を見つけることができませんでした。 エックスサーバーにもアカウントがあったことを思い出しそちらで試したところ、PHPに関するエラーはありませんでした。
退会済みユーザー

退会済みユーザー

2021/04/22 12:12

(私はロリポップ使ったことがないので詳しくないけど)サーバーによってはcurlサポートを切っていることもあるので、phpinfo()を使ってcURL使えるかどうか確認するとか。
退会済みユーザー

退会済みユーザー

2021/04/22 12:21

ロリポップでもcurlは使えています。 ソースコードの上段部分(//ここまで(トークンの取得)まではできていることを確認済み)までは動作確認できました。tokenを取得できています。 上段で取得したtokenを利用し下段でもう一度API接続しようとするのですが、ローカルでは接続できロリポップでは認証エラーになるのです。
tabuu

2021/04/23 06:36

curl_setopt($ch, CURLOPT_HEADER, true); $result = curl_exec($ch); $info = curl_getinfo($ch); var_dump($info); こんな感じでさらに詳細なエラー内容を確認してみてください。
退会済みユーザー

退会済みユーザー

2021/04/23 10:43

ご回答ありがとうございます、上記コードを実行してみました。 違いを調べてみます! -----ローカル環境(XAMPP)----- array(37){ ["url"]=> string(46) "https://エンドポイント/classify" ["content_type"]=> string(16) "application/json" ["http_code"]=> int(200) ["header_size"]=> int(264) ["request_size"]=> int(1334) ["filetime"]=> int(-1) ["ssl_verify_result"]=> int(0) ["redirect_count"]=> int(0) ["total_time"]=> float(7.55256) ["namelookup_time"]=> float(0.001127) ["connect_time"]=> float(0.022392) ["pretransfer_time"]=> float(0.101358) ["size_upload"]=> float(10971) ["size_download"]=> float(193) ["speed_download"]=> float(25) ["speed_upload"]=> float(1452) ["download_content_length"]=> float(193) ["upload_content_length"]=> float(10971) ["starttransfer_time"]=> float(0.101475) ["redirect_time"]=> float(0) ["redirect_url"]=> string(0) "" ["primary_ip"]=> string(13) "プライマリーIP" ["certinfo"]=> array(0) { } ["primary_port"]=> int(443) ["local_ip"]=> string(12) "ローカルIP" ["local_port"]=> int(60512) ["http_version"]=> int(3) ["protocol"]=> int(2) ["ssl_verifyresult"]=> int(0) ["scheme"]=> string(5) "HTTPS" ["appconnect_time_us"]=> int(100987) ["connect_time_us"]=> int(22392) ["namelookup_time_us"]=> int(1127) ["pretransfer_time_us"]=> int(101358) ["redirect_time_us"]=> int(0) ["starttransfer_time_us"]=> int(101475) ["total_time_us"]=> int(7552560) } -----サーバー環境(ロリポップ)----- array(26){ ["url"]=> string(46) "https://エンドポイント/classify" ["content_type"]=> string(16) "application/json" ["http_code"]=> int(200) ["header_size"]=> int(316) ["request_size"]=> int(1358) ["filetime"]=> int(-1) ["ssl_verify_result"]=> int(0) ["redirect_count"]=> int(0) ["total_time"]=> float(0.420455) ["namelookup_time"]=> float(0.004106) ["connect_time"]=> float(0.007998) ["pretransfer_time"]=> float(0.013815) ["size_upload"]=> float(10971) ["size_download"]=> float(97) ["speed_download"]=> float(230) ["speed_upload"]=> float(26093) ["download_content_length"]=> float(97) ["upload_content_length"]=> float(10971) ["starttransfer_time"]=> float(0.063329) ["redirect_time"]=> float(0) ["redirect_url"]=> string(0) "" ["primary_ip"]=> string(13) "プライマリーIP" ["certinfo"]=> array(0) { } ["primary_port"]=> int(443) ["local_ip"]=> string(14) "ローカルIP" ["local_port"]=> int(53222) }
tabuu

2021/04/25 23:28

結果はコメント欄ではなく質問文に追記しておいていただけないでしょうか。 >サーバー環境ではトークンの取得までできたのですが、その後の動作で401エラーが出ました。 レスポンスヘッダーのhttp_codeは200となっていますが、その後の動作で401とはどの箇所でしょうか? あと、念のためローカルとサーバのcurlのバージョンが一致しているかもご確認ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問