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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

1回答

2975閲覧

ajax経由でjsonデータをPOST送信したい

mittchy

総合スコア7

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/09/02 08:58

前提・実現したいこと

jsonデータをajax経由でサーバへPOST送信したいのですが、サーバ側で受け取ると空になってしまい、受け取ることが出来ません。

該当のソースコード

jsonデータ

json

1jsonData = 2{"type":"paragraph","data":{"text":"テスト"}}

ajax処理

ajax

1$.ajax({ 2 'url': url, 3 'type': 'post', 4 'data': { 5 jsonData: jsonData, 6 }, 7 'timeout': 10000, 8 'dataType': "json", 9 }).done(function (data) { 10        //成功 11 }).fail(function (XMLHttpRequest, textStatus, errorThrown) { 12 //失敗 13 });

サーバ(cakephp3.8)

php

1 2 if ($this->getRequest()->is('ajax')) { 3 $data = $this->getRequest()->getData('jsonData'); //値が空 4 5 //何らかの処理 6 7       //結果をjson形式でセット 8 $this->viewBuilder()->setClassName('Json'); 9 $this->set('result', $result); 10 $this->set('_serialize', ['result']); 11 }

試したこと

上記コードのサーバ側で$this->getRequest()->getData();した時の値が空になっていて、処理ができない状態です。

get送信にすると$this->getRequest()->getQuery();に値が入ってくるのですが、データが長すぎると414エラーが出てきてしまいます。

contentType: 'application/json',を追加したりなど試してみたのですが、やはり空の状態で値を拾えておりません。

どなたかわかる方がいらっしゃいましたら教えていただけたらと思います。

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

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

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

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

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

guest

回答1

0

config/routes.phpjsonの拡張子を有効にした後、リクエストURLを.json形式にしてPOSTしてみて下さい。

2020.09.03 追記

すみません、jsonファイルを送るのではなく、<script></script>内で生成したjsonデータを送りたいです。

紛らわしい書き方をしてしまい、申し訳ございません。

上記の方法はjsonファイルではなくjsonデータを送信する方法です。サンプルコードを以下抜粋して記載します。プロジェクト全体のコードはこちらからご確認ください。

config/routes.php

php

1$routes->prefix('Api', function (RouteBuilder $builder) { 2 $builder->setExtensions(['json']); 3 4 $builder->fallbacks(DashedRoute::class); 5});

templates/Pages/home.php

php

1<script> 2window.addEventListener("DOMContentLoaded", async (event) => { 3 const response = await fetch("<?= $this->Url->build([ 4 'prefix' => 'Api', 5 'controller' => 'Users', 6 'action' => 'create', 7 '_ext' => 'json', 8 ]) ?>", { 9 method: "post", 10 headers: { 11 "Content-Type": "application/json", 12 "X-CSRF-TOKEN": "<?= $this->request->getCookie('csrfToken') ?>", 13 }, 14 body: JSON.stringify({ 15 name: "John Doe", 16 }), 17 }); 18 19 const responseData = await response.json(); 20 21 console.log({ responseData }); 22}); 23</script>

src/Controller/Api/UsersController.php

php

1<?php 2declare(strict_types=1); 3 4namespace App\Controller\Api; 5 6use Cake\Log\Log; 7 8class UsersController extends ApiController { 9 public function create() { 10 Log::debug(var_export([ 11 'request_data' => $this->request->getData(), 12 ], true)); 13 14 $success = true; 15 16 $this->set(compact([ 17 'success', 18 ])); 19 20 $this->set('_serialize', [ 21 'success', 22 ]); 23 } 24}

UsersController::createのログ出力

plain

12020-09-03 04:09:39 Debug: array ( 2 'request_data' => 3 array ( 4 'name' => 'John Doe', 5 ), 6)

投稿2020/09/02 10:34

編集2020/09/03 04:25
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

mittchy

2020/09/02 23:57

すみません、jsonファイルを送るのではなく、<script></script>内で生成したjsonデータを送りたいです。 紛らわしい書き方をしてしまい、申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問