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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

API

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

Q&A

解決済

1回答

3151閲覧

laravelのREST APIで、POST送信でstoreを実行したいとき、指定した値がカラムに追加できていない

Shiira

総合スコア3

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

REST

REST(Representational State Transfer)はwebアプリケーションの構築スタイルの一種です。HTTP GET/POSTによってリクエストを送信し、レスポンスはXMLで返されます。SOAPのようなRPCの構築と比べるとサーバからクライアントを分離することが出来る為、人気です。

API

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

0グッド

0クリップ

投稿2021/03/14 03:17

編集2021/03/15 01:28

前提・実現したいこと

PHP初心者です。
laravelでREST APIの実装をしているのですが、curlコマンドでPOST送信でstoreを実行しても、コマンドのオプションに指定しているパラメータがDBへ登録されていません。
ちゃんとPOST送信したパラメータをDBに登録するためには、あとどのような実装が必要でしょうか。

teratailもPHPも不慣れなためお見苦しいところはあるかと思いますが、必要な情報は追記してきますので、よろしくお願いいたします。

実行したコマンドとそのレスポンス

コマンド:contentに「test_content」という値を指定して、テーブルにレコードを追加したい。 curl -XPOST -d 'content=test_content' http://127.0.0.1:8000/api/ttweet/ 実行結果(レスポンスで追加されたレコードを返すようにしています。) {"message":"Tweet created successfully","data":{"content":null,"url":null,"updated_at":"2021-03-14T02:40:33.000000Z","created_at":"2021-03-14T02:40:33.000000Z","id":11}} ↑レコードは挿入されているのですが、値を指定したはずの「content」のカラムがnullになっています。

該当のソースコード

\app\Http\Controllers\TtweetController.php

PHP

1<?php 2 3namespace App\Http\Controllers; 4use Illuminate\Http\Request; 5use App\Models\Ttweet; 6use App\Http\Requests\StoreTtweet; 7 8class TtweetController extends Controller 9{ 10 /** 11 * Display a listing of the resource. 12 * 13 * @return \Illuminate\Http\Response 14 */ 15 public function index() 16 { 17 return response(Ttweet::all()); 18 } 19 20 /** 21 * Show the form for creating a new resource. 22 * 23 * @return \Illuminate\Http\Response 24 */ 25 public function create() 26 { 27 } 28 29 /** 30 * Store a newly created resource in storage. 31 * 32 * @param \Illuminate\Http\Request $request 33 * @return \Illuminate\Http\Response 34 */ 35 public function store(Request $request) 36 { 37 $tweet = new Ttweet(); 38 $tweet->content = $request->input('content'); 39 $tweet->url = $request->input('url'); 40 $tweet->save(); 41 42 return response()->json([ 43 'message' => 'Tweet created successfully', 44 'data' => $tweet 45 ], 201, [], JSON_UNESCAPED_UNICODE); 46 } 47 48 /** 49 * Display the specified resource. 50 * 51 * @param int $id 52 * @return \Illuminate\Http\Response 53 */ 54 public function show($id) 55 { 56 $tweet = Ttweet::find($id); 57 if ($tweet) { 58 return response()->json([ 59 'message' => 'ok', 60 'data' => $tweet 61 ], 200, [], JSON_UNESCAPED_UNICODE); 62 } else { 63 return response()->json([ 64 'message' => 'Tweet not found', 65 ], 404); 66 } 67 } 68 69 /** 70 * Show the form for editing the specified resource. 71 * 72 * @param int $id 73 * @return \Illuminate\Http\Response 74 */ 75 public function edit($id) 76 { 77 78 } 79 80 /** 81 * Update the specified resource in storage. 82 * 83 * @param \Illuminate\Http\Request $request 84 * @param int $id 85 * @return \Illuminate\Http\Response 86 */ 87 public function update(Request $request, $id) 88 { 89 // 90 } 91 92 /** 93 * Remove the specified resource from storage. 94 * 95 * @param int $id 96 * @return \Illuminate\Http\Response 97 */ 98 public function destroy($id) 99 { 100 $tweet = Ttweet::where('id', $id)->delete(); 101 if ($tweet) { 102 return response()->json([ 103 'message' => 'Tweet deleted successfully', 104 ], 200); 105 } else { 106 return response()->json([ 107 'message' => 'Tweet not found', 108 ], 404); 109 } 110 } 111} 112

\webapp\app\Models\Ttweet.php

PHP

1<?php 2 3namespace App\Models; 4 5use Illuminate\Database\Eloquent\Factories\HasFactory; 6use Illuminate\Database\Eloquent\Model; 7 8class Ttweet extends Model 9{ 10 use HasFactory; 11 protected $table = 'T_TWEET'; 12 13 const CONTENT = 'content'; 14 const URL = 'url'; 15 16 protected $fillable = [ 17 'content', 18 'url', 19 ]; 20}

試したこと

こちらのサイトを参考に作成しました。
https://noumenon-th.net/programming/2020/02/12/laravel-api/
他のshow、index、destroyは実行できていることは確認しています。

※追記※
その後で自分で確認したところ、Windows10のコマンドプロンプトで実行すると値が設定できず、git bashで実行すると値が設定できることを確認できました。 ひとまずソースには問題はなかったようです。

git bashの場合
$ curl -V
curl 7.74.0 (x86_64-w64-mingw32) libcurl/7.74.0 OpenSSL/1.1.1i (Schannel) zlib/1.2.11 brotli/1.0.9 zstd/1.4.5 libidn2/2.3.0 libssh2/1.9.0 nghttp2/1.41.0
Release-Date: 2020-12-09
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS brotli HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz Metalink MultiSSL NTLM SPNEGO SSL SSPI TLS-SRP zstd

コマンドプロンプトの場合
curl -V
curl 7.55.1 (Windows) libcurl/7.55.1 WinSSL
Release-Date: 2017-11-14, security patched: 2019-11-05
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL

補足情報(FW/ツールのバージョンなど)

使用環境
Laravel v8.26.1 (PHP v8.0.1)

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

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

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

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

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

Lulucom

2021/03/14 04:40

掲載されたコマンドとコードでは問題無さそうなんですけどね・・・ 本当に掲載通りに今もなっていますか?例えばコントローラではStoreTtweetというフォームリクエストのクラスがuseに書かれていて、掲載コードではまだ使われてはいないようですが、実際のお手元のコードでは使われている、ということはないでしょうか。 また、いずれかのファイルが未保存で、実際には過去のコードで動いてしまっているということはないでしょうか。(念のための確認です)
Shiira

2021/03/14 11:01

はい、StoreTtweetは確かに実装されていますが、問題の切り分けの結果関係ないと判断して載せていませんでした。(実際該当のuseをコメントアウトしても事象が変わりませんでした) そしてすみません、その後で自分で確認したところ、Windows10のコマンドプロンプトで実行すると値が設定できず、git bashで実行すると値が設定できることを確認できました。 ひとまずソースに問題はなかったようです。 せっかくご回答頂いたにもかかわらず、原因は別のところにあったようです。申し訳ございません。
Shiira

2021/03/14 11:02

(コマンドプロンプトでできずgit bashでできる理由については引き続き調べています。)
Lulucom

2021/03/14 13:11 編集

そうでしたか、質問へ追記をお願いします。(ここだと回答される方が見ないかもしれないので) git bashで作業された方が良さそうですね。
Lulucom

2021/03/14 13:11

コマンドプロンプトとgit bashでそれぞれ curl -V を実行すると違うバージョンが表示されますか?
Shiira

2021/03/14 23:55

はい、確認したところバージョンは違っていました。 git bashの場合 $ curl -V curl 7.74.0 (x86_64-w64-mingw32) libcurl/7.74.0 OpenSSL/1.1.1i (Schannel) zlib/1.2.11 brotli/1.0.9 zstd/1.4.5 libidn2/2.3.0 libssh2/1.9.0 nghttp2/1.41.0 Release-Date: 2020-12-09 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp Features: alt-svc AsynchDNS brotli HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz Metalink MultiSSL NTLM SPNEGO SSL SSPI TLS-SRP zstd コマンドプロンプトの場合 curl -V curl 7.55.1 (Windows) libcurl/7.55.1 WinSSL Release-Date: 2017-11-14, security patched: 2019-11-05 Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp Features: AsynchDNS IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL
Lulucom

2021/03/15 00:36 編集

ありがとうございます。バージョン関連の情報も質問へ追記をお願いします。(ここだと回答される方が見ないかもしれないので)
Lulucom

2021/03/16 00:24

-d は --data の省略形のはずなんですが、curl 7.55.1 (Windows) ではそうじゃないという事なのかな・・・-d の代わりに --data を使ってみるとどうでしょうか。というのも何故かそれらの挙動が異なる場合があるという情報を見かけたからです。 また、シングルクォートの代わりにダブルクォートを使ってみるとどうでしょうか。というのもコマンドによってはシングルクォートだと認識されないという情報を見かけたからです。
Lulucom

2021/03/16 00:31 編集

あと、質問のタグに「コマンドプロンプト」や「cURL」などを追加すると良いかもしれません。「Laravel」は関係無さそうですので外した方が良いかもしれません。
Shiira

2021/03/16 13:10

シングルクォートの代わりにダブルクォートを使ってみたところ、登録に成功しました!ありがとうございます。 すみません、結局コマンドを実行するツールの問題でした。
Lulucom

2021/03/16 13:14

理由はよくわかりませんがよかったです^ ^
guest

回答1

0

ベストアンサー

シングルクォートの代わりにダブルクォートを使ってみるとどうでしょうか。

投稿2021/03/16 13:11

Lulucom

総合スコア1899

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問