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

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

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

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

2771閲覧

送信しようとしたらエラーがでてしまう {"message":"missing key in request header"}

iiinnn

総合スコア8

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2021/10/07 09:50

編集2021/10/20 09:58

前提・実現したいこと

簡易的なシステム作りをしているのですが
送信ボタンを押したら下記のようなエラーが出てしまいました。
送信先のURLは指定のものをコピペしたので間違ってはいないのですが。。。

検索してもなにも引っかからず苦戦してしまっているのでお力添えいただけると助かります。
よろしくお願いいたします。

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

{"message":"missing key in request header"}

該当のソースコード

<html> <head> <link rel="stylesheet" href="index.css"> </head> <body> <script src="index.js"></script> <br><br><br> <a href="food.html">好きな食べ物</a> </body> </html>

food.html

<!DOCTYPE html> <html lang="ja" dir="ltr"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="index.css"> <title></title> </head> <body> <script src="index.js"></script> <a href="index.html">戻る</a><br><br><br><br> <form action="https://favorite-foods-app.herokuapp.com/foods" id="formId" onsubmit="changeAction()"> 好きな食べ物 <br> <input type="text"><br> <input type="submit" value="送信"> </form> </body> </html>

index.js

function changeAction(){ let food = "apple"; //変数代入 fetch('~~~',{ method: "POST", body: '{"food":"' + food + '"}', mode: "cors", headers: new Headers({ 'Content-Type': 'application/json', 'Authorization': 'Bearer ~~~', }), }).then(x=>console.log(x)) }

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

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

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

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

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

guest

回答3

0

ベストアンサー

API仕様に

Authorization Bearer xxxxx

とあるので、ヘッダを追加しなくてはいけないのでは?

js

1fetch('https://favorite-foods-app.herokuapp.com/foods',{ 2 method: "POST", 3 body: '{"food":"meat"}', 4 5 headers: new Headers({ 6 'Content-Type': 'application/json', 7 'Authorization': 'Bearer xxxxxx', // 一応隠しておきます 8 }), 9}).then(x=>console.log(x))

というコードを同一ドメインで実行したらレスポンスが返ってきました。
CORSは許可されていないようなので、クライアントからは無理なのではないですか?
(Bearerは普通は公開しないものだと思うんですが、叩いていい奴だったんですよねこれ?)

イメージ説明


コメントを受けて追記

js

1fetch('https://favorite-foods-app.herokuapp.com/foods', // APIエンドポイントのURL 2 { // ここからオプション 3 method: "POST", // メソッドを POST に 4 body: '{"food":"meat"}', // bodyにJSONデータを 5 6 headers: new Headers({ // ここからヘッダ 7 'Content-Type': 'application/json', // 指定されたヘッダその1 8 'Authorization': 'Bearer xxxxxx', // 指定されたヘッダその2 9 }), // ここまでヘッダ 10 } // ここまでオプション 11) // ここまで fetch 12.then(x => console.log(x)) // 戻り値の Promise を then() メソッドで受けとる

投稿2021/10/08 01:28

編集2021/10/09 01:35
Lhankor_Mhy

総合スコア36140

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

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

iiinnn

2021/10/08 01:36

ご回答ありがとうございます。 同じコードを書いてもエラーメッセージは変わりませんでした。 どういうレスポンスが返ってきましたか?
Lhankor_Mhy

2021/10/08 01:39

body があるようでしたので、画像が落ちてきているんじゃないかと思いますが。
Lhankor_Mhy

2021/10/08 01:41

あ、勘違いでした。bodyはないみたいです。 ステータスコードは201です。 本文を.text()で取っても空文字列のようでした。
iiinnn

2021/10/08 01:46

そうなんですね。 Bearerについては削除しておきます。ありがとうございます。
Lhankor_Mhy

2021/10/08 01:46

.json() でも .blob でも取れないですね。 何が返ってくる仕様なんですか?
iiinnn

2021/10/08 01:48

何が返ってくるか、何も聞かされていないので、わからないです。。
Lhankor_Mhy

2021/10/08 01:49

いちおう、スクリーンショットを載せておきます。
Lhankor_Mhy

2021/10/08 01:58

あー、社内研修なんですね。 じゃあ、同一ドメイン上で実行する前提なんですか? もしかして、このAPIを叩いて好きな食べ物を登録し、別のAPIを叩いて好きな食べ物一覧を表示する、みたいな課題ではないですか? (だとしたら、私がたくさん登録してしまいましたが)
iiinnn

2021/10/08 02:03

同一ドメインでも、登録でもないです。送信して完了になります。
Lhankor_Mhy

2021/10/08 02:04

GETで送信したら、お肉がたくさん取得できました????
Lhankor_Mhy

2021/10/08 02:06

では、ご解決な感じですかね?
iiinnn

2021/10/08 02:09

いや、私の方ではエラーが変わっていなく、途中のままです。 楽しそうな感じで羨ましいです。^^ Promise{<pending>}~は記入したものですか??
Lhankor_Mhy

2021/10/08 02:14

いえ、それがレスポンスです。 とすると、このご質問ではなにを求めていますか? すでに「クライアントでは無理っぽい」という回答をしていると思いますが。
iiinnn

2021/10/08 02:20

会話の中でところどころわからないところがあり、ご迷惑おかけして申し訳ないです。 Lhankor_Mhyさんのjavascriptを打ったのですがこちらでは変わりがありませんでした。 その答えがクライアント側だから無理っぽいということでしょうか。
Lhankor_Mhy

2021/10/08 02:24

同一ドメインでない限りは難しいと思います。 会社からは「HTMLとJavaScriptで作って別サーバ立ててそこにアップしろ」と言われているのですか?
iiinnn

2021/10/08 02:29

サーバの事については何も言われていないです。。
Lhankor_Mhy

2021/10/08 02:31

現状はどうしているのですか?
iiinnn

2021/10/08 02:36

会社のサーバを借りています。 上司にサーバの事、ソースのアドバイスなど聞いてみようと思います。
Lhankor_Mhy

2021/10/08 03:02

それがいいと思います。ここのことを話すのであれば、変なリクエストしてごめんなさい、とお伝えください。
iiinnn

2021/10/09 00:51

いえいえ、逆にいつもコメントしていただきありがとうございます。 Lhankor_Mhyさんが書いてくださったコードをみていたのですが 私では理解ができず、どんな作用になっているのか知りたいのですが教えていただいてもよろしいでしょうか?( ;∀;)
Lhankor_Mhy

2021/10/09 01:34

おそらく基礎的なところをご理解されていないと思いますので、ちょっと長くなってしまいますがそこから説明しますね。 まずこれはご存知だと思いますが、HTTPリクエストにはヘッダというものがあります。 https://itsakura.com/network-http-get-post API仕様には、以下のヘッダの追加が指示されていました。 Content-type: application/json Authorization: Bearer xxx このどちらも、form要素を使った送信では(私の知る限りでは)不可能でした。 https://developer.mozilla.org/ja/docs/Web/HTML/Element/form#attr-enctype ですので、JavaScriptで通信してみることにしました。 fetch API を使うのがお手軽でしたので、そちらを使いました。 https://ja.javascript.info/fetch fetch API でヘッダを追加するのは Headers オブジェクトを使うのがお手軽でしたので、そのようにしました。 https://developer.mozilla.org/ja/docs/Web/API/fetch#parameters https://developer.mozilla.org/ja/docs/Web/API/Headers/Headers#%E4%BE%8B fetch API は Promise を返しますので、then() メソッドで処理をしています。 https://jsprimer.net/use-case/ajaxapp/http/#receive-response ただ、最初に試したところ、CORS違反でアクセスできませんでした。 https://ja.javascript.info/fetch-crossorigin ですので、同一ドメインを表示させた上で、開発者ツールのコンソールから上記スクリプトを実行した、というわけです。 --- 以上でだいたいご理解いただけたと思いますが、逐語的に説明したものを回答に追記しておきますね。
iiinnn

2021/10/12 00:48

コメントが送れていなく、返信が遅くなり申し訳ありません。 1からご丁寧にありがとうございます。しっかり勉強していきたいと思います。 サーバの件ですが、nodeを使ってlocalhostから見ていく設定で これからやっていくことになりました。 話は変わりますが body: '{"food":"meat"}', でmeatとやると結果がmeatとしかでず、 htmlで入力したテキスト通りの反映になりません。。 変数を入れてやってみたらいいのかと思ったのですが、、。 こうしたらいいんじゃないか、などあったら教えていただきたいです。(..)
Lhankor_Mhy

2021/10/12 01:04

> 変数を入れてやってみたらいいのかと思ったのですが まさにおっしゃるとおりのやり方で問題ありません。 ですが、JSON.stringify()を使った方が、可読性に優れていると思います。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify つまり、 const food = "meat"; JSON.stringify({food}); みたいな書き方です。 こうすることによって、送信するデータの数が増えた時にも読みやすいコードが書けると思います。
Lhankor_Mhy

2021/10/12 02:02

うーん、まずはしっかり文法を学んだ方がいいですね…… オブジェクトを取り扱うのは iiinnn さんにはまだ難しかったようなのでとりあえず置いておいて、「変数を入れて」の方で取り組んでみてください。 文字列を連結するには + 演算子を使います。 https://jsprimer.net/basic/string/#concat
iiinnn

2021/10/12 07:06

参考サイトまでありがとうございます。 自分で考えてみてみます!
Lhankor_Mhy

2021/10/13 03:10 編集

がんばってください。 わからないことがあればコメントしてください。 あと、2021/10/12 10:39 のコメントに Bearer が書かれていますが、localhost に移したので別にいいや、みたいな感じですか?
iiinnn

2021/10/13 08:36

ありがとうございます。 Bearer ですが、API仕様で指定で書いてあったのでそのまま入れたという感じです。 今日一日、友達に聞いてみたりソースとにらめっこしていたのですが ネットのやり方を自分用に落とし込めず、変数の入れ方がわかりませんでした。。 参考サイトまで用意していただけたのに申し訳ないですが、、教えていただけると嬉しいです。
Lhankor_Mhy

2021/10/13 08:49 編集

変数food に食べ物が入っているとして、 body: '{"food":"' + food + '"}', みたいな感じです。 --- > API仕様で指定で書いてあったのでそのまま入れたという感じ あ、いえ、コメント欄に書いちゃうってことは全世界に公開してるってことなんですけど大丈夫ですか? みたいな話です。
iiinnn

2021/10/13 09:42

すみません、そうでした、、。削除リクエストしておきました。 ありがとうございます。 そして、あのソースは私では思いつきませんでした。 こういう組み合わせも徐々に知っていきたいです。 やってみたのですが、下記のようにエラーが出てしまいました。 foodが定義されていないよってことなのでしょうか。。 Uncaught ReferenceError: food is not defined
Lhankor_Mhy

2021/10/13 13:05

コメントは編集できます。 --- > foodが定義されていないよってことなのでしょうか まさにそのとおりです。 前提として「変数food に食べ物が入っているとして、」と書いた通りです。 変数food に食べ物を入れてください。
iiinnn

2021/10/14 00:15

編集しておきました。 変数foodにappleと入れたのですが 結果はfoodの時と同じでした。入れ方間違っていたなら教えていただけると嬉しいです。 body: '{"food":"' + apple + '"}',
Lhankor_Mhy

2021/10/14 01:22

一般的に「変数xにYYYを入れてください」という言葉は「変数xにYYYを代入してください」という意味です。
iiinnn

2021/10/14 01:35

あっているということでしょうか?
iiinnn

2021/10/14 04:28

いえ、body: '{"food":"meat"}',の時はmeatのみ出てきたのですが body: '{"food":"',peach = orenge = apple,'"}',とやるとなにも出力されませんでした。
Lhankor_Mhy

2021/10/14 04:37

ですよね。エラーが出ていると思います。 さて、代入がわからないとなるとちょっと困りますね。 プログラミングは初めてでしょうか? 変数は、なにかを格納する箱のようなものである、という理解はできていますか? もし「そうだったのか!」という感じでしたら、まず、「変数」という概念を理解されるところから始めてはどうでしょう? https://ja.javascript.info/variables
iiinnn

2021/10/14 08:02 編集

プログラミング初めてです。 なので発言が意味不明なこと言ってるかもしれなく申し訳なく思います。 箱は習いました。でもこの場面で当てはめることができないです。。 いまいち概念を落とし込められていないのかなと思います。。
Lhankor_Mhy

2021/10/14 08:29 編集

がんばってください。 --- もし私にお聞きになりたいことがあるならば、それをはっきりご提示いただきたいと思います。 質問をする時のコツは以下がとてもわかりやすいです。 https://qiita.com/seki_uk/items/4001423b3cd3db0dada7 --- ・変数food に文字列"apple"を代入するのは、 let food = "apple"; です。 ・この 変数food を利用するには、 body: '{"food":"' + food + '"}', です。 ・代入は変数food を利用する前に行わなくてはいけません。 ・let は宣言文なので、関数の中などに書くことはできません。 ・fetch(...) は関数です。
iiinnn

2021/10/14 09:13

分かりにくかったら申し訳ありませんが、 ヒントをいただいたので以下のように書いてみました。 変数foodの代入の仕方がわからないので教えていただきたいです。 15分考えた結果が以下で、知識そのものがないから ヒントの中でしか順番を移せませんでした。 コンソールを見てみると”” ””と出てきてくれました。 function changeAction(){ let food = "apple"; body: '{"food":"' + food + '"}', fetch('https://~~~',{ method: "POST", mode: "cors", headers: new Headers({ 'Content-Type': 'application/json', 'Authorization': '~~~', }), }).then(x=>console.log(x)) } また下のように打ってみたのですが(そもそも間違っているとは思いますが) banana; はエラーにならないのに apple; はエラーになってしまう理由もわからないので 教えていただきたいです。 body: '{"food":"'apple; + food + banana;'"}',
Lhankor_Mhy

2021/10/14 10:46

> banana; はエラーにならないのに apple; はエラーになってしまう理由 ごめんなさい。何を言っているのかわからないです。 「このコードならこのエラーが出るが、このコードはエラーが出ない」のように、コードとエラーメッセージを提示してください。 --- なお、body: ... の部分は宣言文ではないです。
iiinnn

2021/10/14 23:46

すみません、以下のように修正してみました。 コンソールを見てみると、何も出てきてくれませんでした。 body: ...の部分をどう変えたらいいのかがわからないので教えていただきたいです。 function changeAction(){ let food = "apple"; fetch('~~~,{ method: "POST", body: '{"food":"' + food + '"}', mode: "cors", headers: new Headers({ 'Content-Type': 'application/json', 'Authorization': '~~~', }), }).then(x=>console.log(x)) }
Lhankor_Mhy

2021/10/15 00:33

changeAction() はどのようにして呼び出していますか? --- > body: ...の部分をどう変えたらいいのかがわからない そのコードで変える必要はないと思うのですが…… どういう不明点がありますか?
iiinnn

2021/10/15 01:03 編集

> changeAction() はどのようにして呼び出していますか? food.htmlの以下の部分から呼び出しています。 <input type="button" value="送信" onclick="changeAction()"> meatの時にbodyのところからコンソールで反映されていたのですが body: '{"food":"' + food + '"}',だと何も反映されいないので そこが違っているのかなと思ったのですが、、
Lhankor_Mhy

2021/10/15 01:10

「コンソールで反映されていた」というのは、SQLとかのコンソールですか?
iiinnn

2021/10/15 01:29

postmanを使って反映させています。 そこのコンソールの事です。
iiinnn

2021/10/15 01:55

そうです!
Lhankor_Mhy

2021/10/15 02:19

何度か使ったことありますが、これってPOSTを送信するアプリだったように思うのですが、ブラウザのPOST送信を監視することってできましたっけ?
iiinnn

2021/10/15 02:30

body: '{"food":"meat"}', でやったときmeatと表示されていたのでできると思います。 (質問の意味を間違って理解していたら申し訳ないです)
Lhankor_Mhy

2021/10/15 02:43

そうなんですね、それについてはちょっと使い方がわからないですね。
iiinnn

2021/10/15 02:58

反映されるだけなのでpostman事体をどうこうするのはないと思います。。 index.jsのソースはもう改善することがないということでしょうか?
Lhankor_Mhy

2021/10/15 03:03

全体がわからないので何とも言えないですが、当方でご提示のコードを試してみましたところ、POST送信はできているようです。
iiinnn

2021/10/15 07:29 編集

私の方でも見てみたら反映されていました。 ですが、入力した内容ではなく ”apple” だけでしか反映されていませんでした。
Lhankor_Mhy

2021/10/15 07:32

あなたのお書きになったJavaScriptとHTMLをブラウザで表示し、「送信」を押して、DevTools で通信の内容を確認しました。 もちろん、こちらにはサーバ側が存在しないためエラーが返ってきますが、送信自体は成功しています。
iiinnn

2021/10/15 07:32

let food = "apple"; ↓ let food = "food"; に変えてみても"apple"表示のままでした。。 入力した内容を反映させるにはどうしたら良いのかわからないので教えていただきたいです。
Lhankor_Mhy

2021/10/15 07:38

おお、送信できたのですね! ではもう少しですね、よかったよかった。 当方では、そのような現象は起きませんでした。 JavaScript を変更した後に保存し忘れている、デプロイ(アップロード)を忘れている、ページのリロードを忘れている、ページのキャッシュが効いている、などの原因が考えられると思います。
iiinnn

2021/10/15 08:46

頑張りたいです。 ただ、いただいた四点をやってみても変わりませんでした。。(´;ω;`) なので、上司に聞いてみようかなと思います。
Lhankor_Mhy

2021/10/15 09:32

それがいいと思います。 もしかして、postmanで送信してしまっているのかな、みたいなことを思っています。
iiinnn

2021/10/15 09:45

HTML の送信をクリック→postman の send をクリック しています。 やり方を聞いて、終えることができたらこの質問を閉じようと思います。 一週間も長い間、誠実にお付き合いいただきありがとうございます。
Lhankor_Mhy

2021/10/15 09:49

> HTML の送信をクリック→postman の send をクリック しています たぶん、それはダメだと思います。
iiinnn

2021/10/15 09:59

えっ、、、衝撃でした。。 もちろん、index.js 保存してページ更新はしています。
Lhankor_Mhy

2021/10/15 10:08 編集

実際の画面を見ていないので断言できないですが、index.js のリクエストとは無関係にpostリクエストしていると思います。 だから、index.js を書き換えても結果が変わらない、と考えるとつじつまが合うので……
iiinnn

2021/10/15 10:10

つまり、、なんの操作をしたらよいのでしょうか、、、
Lhankor_Mhy

2021/10/15 13:18

うーん、私が間違ってるかもしれないですしねえ。 そもそも、この課題はどうなったらクリアと言われているのですか?
iiinnn

2021/10/16 00:16

私の方が経験値も浅くpostmanも触っていないので Lhankor_Mhyさんの方が正しいと思っています。 どのような操作が足りないと思ったのですか? 任意の内容がそのまま反映されて、送信完了メッセージがでてくればクリアになります。
Lhankor_Mhy

2021/10/16 01:03 編集

> どのような操作が足りないと思ったのですか? 足りないというより、postman は不要だと思います。 > 任意の内容がそのまま反映されて、送信完了メッセージがでてくれば それだけならpostmanで送信すれば終わりですよね。 それをHTMLとJavaScriptで作るように指示されているのではないですか?
iiinnn

2021/10/18 09:21

なるほど、、それなら完成ということでよろしいということですか??
Lhankor_Mhy

2021/10/18 13:56

完成かどうかは私が判断していいのですか? なにか勘違いをされているようですが、問題を解決する主体は私ではなくてあなたですよ?
iiinnn

2021/10/19 00:44

postmanはいらないとなるとそうなのかなと思いまして、、
Lhankor_Mhy

2021/10/19 00:52

わかりにくくてすみません。 ・送信することだけが課題ならば、postman で送信して終わりなので、HTMLもJSもいらない。 ・HTMLとJSで何かを作るのが課題ならば、postman はいらない。 どちらですか? ということをお聞きしています。
iiinnn

2021/10/19 01:46

今、写真を追加しました。 追記と書いてあるものが完成形です。 >・送信することだけが課題ならば、postman で送信して終わりなので、HTMLもJSもいらない。 送信すればいいように感じので上記なのかなと思います。
Lhankor_Mhy

2021/10/19 02:04

追記拝読。 たぶん、HTMLとJSで作成する課題だと思います。 少なくとも、画面仕様が示されているので、そのような画面を作る必要があるでしょう。 また、送信したら終わりではありません。送信に成功したらメッセージを表示する、という指示が書かれています。 まず、仕様をよく読んで理解するところから始めましょう。 iiinnn さんが最初に作っていたHTML二つを元に作成するのがいいでしょう。 postman はPOST送信のテストをするには有効ですが、課題の成果物には関係がありません。
iiinnn

2021/10/19 02:25

ありがとうございます。 Lhankor_Mhyさんと私で出力結果が違うのも postmanは関係ないから気にしなくてよいということでしょうか?
iiinnn

2021/10/19 03:28

わかりました。 ありがとうございます。 質問をクロースしたいと思います。 付き合っていただきありがとうございました。
Lhankor_Mhy

2021/10/19 05:45

了解です。 完成までがんばってください。
guest

0

APIの仕様が不明ですね

  • methodをpostにする
  • 送信データのパラメータ名foodにする

で試しましたが、変わらないです
API利用に際してなんらかのトークンが必要なのかもしれません

投稿2021/10/08 00:33

yambejp

総合スコア114968

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

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

iiinnn

2021/10/08 01:06

ご回答ありがとうございます。 やはり難しいですかね。。 もう少し考えてみます。
yambejp

2021/10/08 01:13

APIが公開されているのであれば仕様書がどこかにあるはずです 質問に貼り付けた仕様の画像はどこから入手しましたか?
iiinnn

2021/10/08 01:18

研修での課題でいただいたものです。
guest

0

name属性が必要なのでは?

HTML

1<input type="text" name="food">

投稿2021/10/07 12:43

itagagaki

総合スコア8402

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

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

iiinnn

2021/10/08 00:21

ご回答ありがとうございます。 name="food"と付け足してみましたが、エラー文に変化はなかったです。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問