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

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

ただいまの
回答率

90.49%

  • PHP

    20379questions

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

  • jQuery

    6720questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 351

HTIun

score 2

 前提・実現したいこと

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

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

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

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

$.ajax({
    type    : "POST",
    url     : 'test.php',
    data    : {code:"002"},
    datatype: "html",
  }).done(function(data){

  }).fail(function(data){

});
<?php

if($_REQUEST['code']=='001'){
  echo '<p>成功</p>'
  header('HTTP',true,200);
}else{
  echo '<p>エラー</p>'
  header('HTTP',true,500);
}

 試したこと

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

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

jQuery 3.1.1
PHP 7.1.7

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

こんにちは。

「リクエストされた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 12:38

    404はNGでしょう
    ほんとになかった場合と切り分けができないので

    キャンセル

  • 2018/07/02 12:40

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

    キャンセル

  • 2018/07/02 16:34

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

    キャンセル

  • 2018/07/02 17:18

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

    キャンセル

  • 2018/07/02 18:17 編集

    @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() すればよいです。

    キャンセル

  • 2018/07/02 23:54

    @HTIunさん

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

    キャンセル

  • 2018/07/02 23:57

    @yambejpさん
    コメントありがとうございます。今後の回答の参考にさせて頂きます。

    @asahina1979さん
    > 451 Unavailable For Legal Reasons
    上記のステータスコードは知りませんでした。勉強になりました。ありがとうございます。

    キャンセル

  • 2018/07/03 09:11

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

    キャンセル

+2

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/03 09:12

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

    キャンセル

+2

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/03 09:12

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

    キャンセル

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

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PHP

    20379questions

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

  • jQuery

    6720questions

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