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

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

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

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

3回答

1013閲覧

httpステータスコードについて

HTIun

総合スコア8

PHP

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2018/07/02 01:23

前提・実現したいこと

PHP・jQuery・css・htmlを使用して、システムを作成しています。
そこで、jqueryの$.ajaxを使用してサーバーにマスタ存在チェックを行いたいです。

もし、サーバー側で、マスタ無しエラーになった場合、httpステータスコードで、
エラーOR正常を判断したいです。
このような場合、どのような値をサーバーから返したほうがよいのでしょうか?

教えてください。
よろしくお願いします。

たとえばこのようなソース

javascript

1$.ajax({ 2 type : "POST", 3 url : 'test.php', 4 data : {code:"002"}, 5 datatype: "html", 6 }).done(function(data){ 7 8 }).fail(function(data){ 9 10});

php

1<?php 2 3if($_REQUEST['code']=='001'){ 4 echo '<p>成功</p>' 5 header('HTTP',true,200); 6}else{ 7 echo '<p>エラー</p>' 8 header('HTTP',true,500); 9} 10

試したこと

上記のロジックだと、httpステータスコードが500の為、failになってしまい、
返値をhtmlで受け取れなかったです。

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

jQuery 3.1.1
PHP 7.1.7

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

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

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

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

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

guest

回答3

0

ベストアンサー

こんにちは。

「リクエストされたURLによるリソースが存在しない」

ということを、定義上、明確に示している(=ステータスコードのメッセージ部分に、
「存在しない」意味のテキストが含まれている。)ようなステータスコードとして、
よく使われるものが2つあり、時と場合に応じてより適切なほうを選ぶとよいかと思います。

  • 1つは、存在しないリソースを要求するリクエストをしたこと自体がエラーであることを明示したい場合は

404 NOT FOUND

が適切かと思われます。

  • もう1つは

204 No Content

です。これは成功を表すステータスコードで、この場合、
レスポンスボディは空にするのがお約束です。
204を返すケースの例としては、何らかのリソースをPOSTで新規
作成を要求したときに、その要求が成功して、特にレスポンスボディを
返す必要がないときに使うことがあります。

また、GETリクエストにクエリパラメータを与えて、リソースの検索をした結果、
検索は正常に行われたけれども、該当するものがなく、レスポンスボディとして
空を返したい場合にも用いられることがあります。

上記をふまえご質問の

マスタ無しエラー

というのは、データベースのマスタ系テーブルに含まれないパラメータが
リクエストに含まれていることだと思いますが、その場合は、リクエストが
不正で、処理が失敗したことを明示するために、

404 NOT FOUND

が適切と思われます。あるいは、

400 Bad Request

でもよいかもしれませんが、いずれにせよ、リクエストボディの中に

指定されたマスタ(code=002)は存在しない。

というようなエラーメッセージを含めるとよいと思います。

ちなみにステータスコードの定義は以下

W3C: Status Code Definitions

に書かれています。

以上、参考になれば幸いです。


補足 1

APIの設計時に、レスポンスコードに何を返すか?というのは、個人の考え方により、意見の分かれる
ところですので、最終的には、レスポンスコードの一覧を見たうえで、質問者様が
「これがよさそう」と思うところを選べばよろしいかと思います。


補足 2

ステータスコードの200番台系、400番台系、500番台系のうち、どれを返せば良いか?について、
極めて現場的なやり方の一例を示します。(※ウォーターフォールではなく、アジャイルです)

まず、

  • 成功の場合 → 200番台系
  • 失敗の場合:

  ・リクエスト側に原因あり→ 400番台系
・サーバー側に原因あり→ 500番台系

と分けられますが、リクエスト側に原因あり(400番台系)のケースとして、Aという状況と、
Bという状況の2つあった場合、

Aによるエラーと、Bによるエラーは、ともにリクエストに原因があるので、400番台系を返させることは
決まっているが、Aの場合は何番で、Bの場合は何番にしたらよいだろう?

と考えていくわけですが、このとき、具体的に何番にしたらよいか分からないときは、

リクエストに問題がある場合は、とりあえず すべて400 Bad Request を返すことに

しておいて、必要に応じて後で詳細化する

ことにします。
同様にサーバー側に起因するエラーの場合、細かく分ければ違う状況でも、とりあえず
500 Internal Server Error だけを返すことにし、同様に、成功の場合は、200 OK だけを
返す、という設計にしておいて、これに基づいて、サーバー側と、(JQueryなどで)フロントエンド側を
実装していきます。

つまり、

  • (200番台,400番台,500番台を返すべき状況では、)200, 400, 500 だけしか使わない

という、ざっくりな設計でとりあえず始めます。

その後、たとえば、

ログインしている状態でのみアクセス可能なリソース取得や更新をログインしていない状態
で試みた場合は、クライアント側でログインページを表示させたいので、他の 400 Bad Request
のケースと分ける意味で、401 Unauthorized を返させよう。

だとか、あるいは

ログインしているユーザーの権限レベルでは禁止されているリクエストを受けたときは、
403 Forbidden を返させよう。

だとか、必要に応じて分けていき、その詳細化に応じてサーバーとフロントで実装を追加します。
逆にいえば、

リクエスト不正の場合は、ステータスコードは400だけを使い、詳細はレスポンスボディに記述することにしよう。

という設計も、(いいか悪いかは別として、可能か不可能かでいえば、)出来なくはない、ということになります。

また、成功の場合も同様で、初めは全て、200 OK を返すことにしていたけれど、何かの理由で

POST で何らかのリソースを新規作成することに成功したことを、他のリクエストの成功とは
区別したいので、その場合は、201 Created を返させよう。

といった感じで詳細化していきます。


補足 3

ご質問のタイトルである、「httpステータスコードについて」、

どのような値をサーバーから返したほうがよいのでしょうか?

に応える良書を一冊挙げます。

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

以下は、上記の書籍の目次、「第8章 ステータスコード」から引用しました。

8.4  よく使われるステータスコード

200 OK — リクエスト成功

201 Created — リソースの作成成功
301 Moved Permanently — リソースの恒久的な移動
303 See Other — 別URIの参照
400 Bad Request ー リクエストの間違い
401 Unauthorized — アクセス権不正
404 Not Found — リソースの不在
500 Internal Server Error — サーバ内部エラー
503 Service Unavailable — サービス停止

私見ですが、とりあえず上記9個は覚えておき、適切に使い分けられるようにして、
どれにも当てはまらないように思える状況のときは、ステータスコード一覧を調べてみる、
という対応で、まずは十分ではないかと思います。

投稿2018/07/02 03:07

編集2018/07/02 15:50
jun68ykt

総合スコア9058

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

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

yambejp

2018/07/02 03:38

404はNGでしょう ほんとになかった場合と切り分けができないので
退会済みユーザー

退会済みユーザー

2018/07/02 03:40

rfc7725 (HTTP STATUS 451 Unavailable For Legal Reasons) も忘れないで上げて
HTIun

2018/07/02 07:34

返信ありがとうございます。 404を返すと、サーバーからの返値がHTMLでなくなる為、echo '<p>エラー</p>'の部分が取得できなくなってしまいます。どのようにすればよろしいでしょうか?
HTIun

2018/07/02 08:18

console.logで調査したところ、failの返り値のxhr.responseTextにhtmlがありました。
jun68ykt

2018/07/02 14:53 編集

@HTIunさん > 404を返すと、サーバーからの返値がHTMLでなくなる為、echo '<p>エラー</p>'の部分が取得できなくなってしまいます。どのようにすればよろしいでしょうか? ご質問に挙げられている、PHPのコードの以下の部分 else{ echo '<p>エラー</p>' header('HTTP',true,500); } の header('HTTP',true,500); を、 header('HTTP', true, 404); に変更すれば、レスポンスボディに "<p>エラー</p>" が含まれ、かつ、レスポンスコードが 404 になるかと思いますが、いかがでしょうか? > console.logで調査したところ、failの返り値のxhr.responseTextにhtmlがありました。 ご確認ありがとうございます。 はい。レスポンスボディに "<p>エラー</p>" が含まれているので、xhr.responseText で それを取り出せます。取り出せたら、その "<p>エラー</p>" をどこかエラーメッセージを 出したい要素のinnerHTML に入れる、または、JQuery を使われているようですので、xhttp.responseText を適切な要素の子要素にするのは、その要素に append() すればよいです。
jun68ykt

2018/07/02 14:54

@HTIunさん 補足2,補足3 を追記しました。何か疑問な点等ありましたら、お知らせください。
jun68ykt

2018/07/02 14:57

@yambejpさん コメントありがとうございます。今後の回答の参考にさせて頂きます。 @asahina1979さん > 451 Unavailable For Legal Reasons 上記のステータスコードは知りませんでした。勉強になりました。ありがとうございます。
HTIun

2018/07/03 00:11

詳しい返信ありがとうございます。 とても参考になりました。
guest

0

どのような値をサーバーから返したほうがよいのでしょうか?

(社会人的には「~~した方がよいでしょうか?」という質問の仕方は避けるべきですが)

ステータスコードは基本的に通信自体の状態を判断するものなので、
使い方が違うと思います。
OKでもNGでも0でも1でも何でもいいのでdoneのdataに返して判定すれば良いと思います。
failが受け取るのはPHP的にはExceptionのような状態です。
「データが存在しない」という結果はシステム側としては「正常」に問い合わせが返ってきた「正常」な状態なので、堂々とdoneで処理して良いです。

投稿2018/07/02 01:31

編集2018/07/02 01:32
m.ts10806

総合スコア80765

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

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

HTIun

2018/07/03 00:12

返信ありがとうございました。 参考になりました。 ※言葉使い気をつけます。
guest

0

処理の内容については分かりませんが
リクエスト自体は通ってデータを返すわけだから、500番台よりは400番台の方が適切かと思います。
HTTPステータスコード - Wikipedia

投稿2018/07/02 01:31

efcode

総合スコア422

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

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

HTIun

2018/07/03 00:12

返信ありがとうございました。 Wikipedia参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問