54004


お世話になります。

JavaScriptのFetch APIを利用してASP.netからJSONデータを取得しています。  
下記のように、エラーステータス（400等）を返却すると、response.okはfalseとなり、response.json()で「Syntax
error:JSON.parse: unexpected character at line 1 column 1 of the
JSON」になってしまいます。  
responseの中身をみると、bodyUsedがfalseになっており、bodyがそもそも空になっているようです。  
response.okがfalseでもjsonを取得することはできますでしょうか？

JavaScript側

[code]

    const getData = () => {
      fetch("url", { method: "GET"}).then(response => {
        // response.ok がfalseの時、SyntaxErrorになる
        if (response.ok) {
          response.json();
        }
      }).then(json => {
        console.log(json);
      }).catch(error => {
        console.log(error);
      });
    }
    
[/code]

ASP.net側実装

[code]

    [HttpGet]
    public ActionResult Get()
    {
      // 検証のため常に 400 bad request を返却
      Response.StatusCode = 400;
      return Json(new { error = "error", message = "エラーです" });
    }
    
[/code]

[参考にしたサイト]  
MDN Fetch API（<https://developer.mozilla.org/ja/docs/Web/API/Fetch_API>）  
Fetch Standard（<https://fetch.spec.whatwg.org/>）

よろしくお願いいたします。


CC BY-SA 4.0
2019-04-03T08:34:33.600
53888
2019-04-08T00:35:26.643
30742
question
javascript asp.net
Fetch API でresponse.okがfalseの時でもjsonデータを取得することはできますか？


Fetch
APIでは、`response.ok`が`false`のときでも`response.json()`でJSONデータを取得（デコード）することができます。

今回Syntax Errorが発生するのは、HTTPリクエストの結果返ってきているものがそもそもJSONではないため発生していると考えられます。  
よって、今回の場合はfetchそのものの問題というより、以下の2つのどちらかであると思われます。

  1. `fetch`に指定したURLが間違っている。
  2. サーバー（ASP.net）側が間違っている。

ご質問からではこれ以上具体的なことは分かりませんが、例えば1については手動でURLにアクセスしてみて正しくJSONが返ってくるかどうか確かめてみるなどの対応が可能かと思います。


CC BY-SA 4.0
2019-04-03T15:29:18.580
53897
2019-04-03T15:29:18.580
30079
53888
answer


自己解決しましたのでご報告です。  
結論として、ASP.net側の実装がまずかったということでした。

[対応内容]  
Getレスポンスする時は、「JsonRequestBehavior.AllowGet」を設定する必要がありました。

[code]

    [HttpGet]
    public ActionResult Get()
    {
      // 検証のため常に 400 bad request を返却
      Response.StatusCode = 400;
      return Json(new { error = "error", message = "エラーです" }, JsonRequestBehavior.AllowGet);
    }
    
[/code]

[参考]  
JsonResult Class <https://docs.microsoft.com/en-
us/dotnet/api/system.web.mvc.jsonresult?view=aspnet-mvc-5.2>

[補足]  
パッケージの不整合、または古いパッケージを使っていると上記対応でもだめかもしれないです。  
理由がはっきりしていないのですが、既存のプロジェクトでは上記の修正を行ってもJsonが取得できない状態でした。試しに新しいプロジェクトで既存のソースを実行したところJsonが取得できるようになりました。  
（どのパッケージがどうなのかまで検証していないため他の方のお役に立てるかどうかわかりませんが…）


CC BY-SA 4.0
2019-04-08T00:35:26.643
54004
2019-04-08T00:35:26.643
30742
53888
answer