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

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

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

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

PHP

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

Q&A

解決済

2回答

2375閲覧

flutter→phpへのPOST通信によるデータの受け渡しができない。

Y.Mamoru

総合スコア47

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

PHP

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

0グッド

0クリップ

投稿2022/08/09 09:22

やりたいこと

Flutterアプリケーションで入力した値をphpで作成したAPIで受け取りたい。

現状と質問

Flutter作成したアプリケーションのログイン画面で入力した値を
JSON形式で送信し、
PHPで作成したAPIで受け取ろうとしています。

現状POST通信ができていることだけは確認できています。
(PHPからのレスポンスステータスコードを確認)

しかしリクエストの引数にいれたものが、
PHP側で受け取れていません。

その理由がわからないです。

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

APIを側で起こっているエラーメッセージです。↓

Uncaught Error: Using $this when not in object context

こちらのエラー文は、CakePHPの書き方を、CakeではないPHPで書いているからだろうとは考えているのですが、
同じ動きをする別の書き方がわからないので、
別途わかれば教えていただきたいです。
(以下の部分です)

php

1$mail = $this->request->getData('mail_api') ?? null; 2$pass = $this->request->getData('pass_api') ?? null;

ソースコード

Flutter(送信側)

dart

1//APIへの接続 2//mailとpassを引数としてAPIへPOST送信するように作っています。 3 Future<void> accessAPI() async{ 4 var url = Uri.parse("http://***.***.**.**/loginAPI.php"); //パスは本来正しいものを入れています。 5 var request = new SampleRequest(mail_api: 'abcd', pass_api: 'efgh'); //仮の引数を送っています。 6 try{ 7 final response = await http.post(url, 8 body: json.encode(request.toJson()), 9 headers: {"Content-Type": "application/json"}); 10 if (response.statusCode == 200) { 11 print("#成功"); //「成功」が表示されるので、疎通確認は取れていると判断しています。 12 } else { 13 print(response.statusCode); 14 } 15 }catch(error){ 16 print(error); 17 print("接続失敗"); 18 } 19 } 20 21class SampleRequest { 22 final String? mail_api; 23 final String? pass_api; 24 SampleRequest({ 25 this.mail_api, 26 this.pass_api, 27 }); 28 Map<String, dynamic> toJson() => { 29 'mail_api': mail_api, 30 'pass_api': pass_api, 31 }; 32}

次にAPI側です。

php

1<?php 2// 文字コード設定 3header('Content-Type: application/json; charset=UTF-8'); 4$body = file_get_contents('php://input'); 5print "bodyの中身:".$body; //ここで中身を確認すると何も表示されません。 6$data = json_decode($body, true); 7print "dataの中身:".$data; //ここでも中身を確認すると何も表示されません。 8//$mail = $this->request->getData('mail_api') ?? null; 9//$pass = $this->request->getData('pass_api') ?? null; 10 11if (empty($mail)) { 12 $this->badRequest('mail is empty. This message from API.'); 13} 14$response = []; 15$response['mail'] = $mail; 16$response['message'] = 'api success. This message from API.'; 17$this->httpNormalResponse($response); 18 19?>

試したこと

私が参考にしているページを載せておきます。
https://qiita.com/kenichiro-yamato/items/12d7199cb2d7812ac0ce
https://qiita.com/YoshiakiOshima/items/40aac200b37fe98b9835
https://forsmile.jp/development/php/1709/

もしわかれば宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

ちょうど同じことをしていたので回答します
ただ,CakePHPは使用していないので普通のPHPです
先の人がおっしゃっているように通常PHPでPOST受け取る場合は以下の関数を使います.
$_POST
filter_input()
で,これで受け取れた書き方は

dart

1 http.Response resp = await http.post(Uri.parse(uri), body: { 2 "test": "hoge" 3});

こんな感じです.
詳細は検証していないので兎も角
公式
https://pub.dev/packages/http
でもheadersを利用する書き方はしていないです.

なお,これも検証してないですが
file_get_contents()
を使用すればこれまでの方法でも取得できるのかもしれません.

投稿2022/08/13 21:17

tanukikko

総合スコア16

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

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

0

結局はリクエストの受け取り方の話ですよね。
POST送信してるならひとまず$_POST
あとfilter_input()

こちらのエラー文は、CakePHPの書き方を、CakeではないPHPで書いているからだろうとは考えているのですが、

それならいっそCakePHPでWebAPI作って受け取った方がご自身がやりやすい書き方になるのでは。

投稿2022/08/09 09:27

編集2022/08/09 09:29
m.ts10806

総合スコア80850

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

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

Y.Mamoru

2022/08/10 00:44

$_POSTはJSONデータの送受信の際にも使用できるのでしょうか? 一度試してみて、$_POSTを使用した場合でも結果が変わらなかったので、 JSONデータだから駄目なのか、という理解をしていたのですが。 filter_input()は、 filter_get_contents()を使用するのではなく、filter_input()を使用する、といういみですか?
m.ts10806

2022/08/10 01:04

JSONデータといっても文字列です。 Flutterには詳しくないですが、まずはvar_dump($_POST)とかで確認してみてはどうでしょうか。 リクエストとして送られているキーも分かるかと。 >filter_get_contents()を使用するのではなく、filter_input()を使用する、といういみですか? いえ、filter_input()は提示したPHPマニュアル読んでいただければわかりますが、 リクエストを受け取るので$_POSTや$_GETと同等の使い方をされます(フィルターかけられるのでバリデーションも込みで使えたり便利であるため推奨されているところはあります)
Y.Mamoru

2022/08/10 07:44

なるほど。ありがとうございます。 $_POSTとfilter_inputを両方試してみました。 var_dumpで確かめた結果 $_POSTの値はarray(0){} filter_inputの値はnull でした。 なので、値を飛ばすことができていない、ということがわかりました。 ただ何故飛ばせていないのかがまだわかりません。 もし気付きがあればご教授願いたいです。
m.ts10806

2022/08/13 22:17

送る側に問題ありそうに思いますが、 そもそもPHPに送られた値はどのように確認していますか? 非同期で送信されるのであれば、例えばブラウザでPHP直に実行してしまうとPOSTではなくGETになります。 操作、確認方法も含めて質問本文に追記してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問