24

これが私のコードです:

      $.ajax({
        url: "/api/invoice/" + newInvoice._id,
        type: 'PUT',
        data: JSON.stringify(newInvoice),
        dataType: 'json',
        contentType: "application/json; charset=utf-8"
      })
        .success(function () {
          $('#statusLine').text('Successfully submitted invoice {0}. Click here to dismiss.'.format(newInvoice._id));
        })
        .error(function (err) {
          alert(err);
        });

リクエスト:

PUT http://localhost:8000/api/invoice/16211 HTTP/1.1
Host: localhost:8000
Connection: keep-alive
Content-Length: 770
Origin: http://localhost:8000
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11
Content-Type: application/json; charset=UTF-8
Accept: application/json, text/javascript, */*; q=0.01
Referer: http://localhost:8000/invoice.html?id=16211
Accept-Encoding: gzip,deflate,sdch
Accept-Language: fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

{"items":[{"id":...

リクエストの本文は実際には有効なjsonです。簡潔にするために、リクエストの本文を切り捨てました。

応答:

HTTP/1.1 409 Conflict
X-Powered-By: Express
Content-Type: application/json; charset=utf-8
Content-Length: 1386
ETag: 250542419
Connection: keep-alive

{
  "msg": "Cannot update the invoice #16211, because it has already been updated by someone else.",
  "invoice": {
    "items": [
      {...

繰り返しますが、応答は完全に有効なjsonであり、簡潔にするために切り捨てられています。

予想どおり、errorハンドラーはerrオブジェクトとともに呼び出されます。ただし、解析されたjsonを取得するにはどうすればよいですか?もちろん、応答のコンテンツタイプがjsonであることを確認してから、err.responseText自分自身を解析することもできますが、jQueryajaxが私のために行うことになっているのではないでしょうか。$.getつまり、サーバーからオブジェクトを取得するときのクエリに対してそうします。

私は何が欠けていますか?

編集

これはhttps://stackoverflow.com/a/12310751/80002の修正です:

リクエストの実行:

var ajax = $.ajax(...

エラー応答の処理:

var res, ct = ajax.getResponseHeader("content-type") || '';
if (ct.indexOf('json') > -1) {
  res = $.parseJSON(err.responseText);
  // process the response here
}
4

4 に答える 4

26

200 1以外の HTTPステータスコードを含むエラーメッセージの場合、コンテンツはjQueryによって解析されません。返された結果を自分でJSONに解析したくない場合は、HTTPステータス200を返し、successdone)コールバックを使用する必要があります。

(例から)HTTPコード409を使用していることを示す良い兆候です。これを継続する必要があると思います。弾丸をかみ、エラーハンドラーでJSONを手動で解析するだけです。解析が失敗した場合、他の問題(一時的なネットワーク障害など)が発生しますが、これにより、成功関数にエラーチェックをあまり組み込むことなく、自分(および場合によっては他の人)が使用できる優れたAPIを構築できます。

success幸せな結果とerror不幸な結果のために保管してください。

1技術的には、2xxステータスはすべて成功と見なされます。jQuery(status >= 200 && status < 300 || status === 304)では成功したものとしてカウントされます

于 2012-09-07T01:51:26.510 に答える
12

エラーコール$.parseJSONバックで明示的に呼び出します。

(...)
.error(function (err) {
  var msg = $.parseJSON(err).msg;
  alert(msg);
});
于 2012-09-07T01:56:03.063 に答える
0

JSON 形式を取得するのは非常に簡単です。すでに jQuery で取り上げられています。

var error = error.responseJSON
于 2020-05-09T20:10:21.237 に答える