programing

jQuery로 JSON ajax 요청에서 404의 함수를 콜백하는 방법은 무엇입니까?

bestprogram 2023. 10. 9. 23:26

jQuery로 JSON ajax 요청에서 404의 함수를 콜백하는 방법은 무엇입니까?

저는 JSON에서 응답을 받아 Ajax 요청을 하고 싶습니다.그래서 저는 Ajax의 요청을 했습니다.

$.ajax({
    url: 'http://my_url',
    dataType: "json",
    success: function(data){
      alert('success');
    },
    error: function(data){
      alert('error');
    },
    complete: function(data) {
      alert('complete')
    }})

이 코드는 잘 작동하지만 내 url이 HTTP 코드 404를 전송하면 콜백이 사용되지 않으며, 심지어 완전한 콜백도 사용되지 않습니다.조사해보니 제 dataType이 'json'이라서 404 return이 HTML이고 JSON parsing이 실패했기 때문입니다.그래서 콜백은 안 됩니다.

404를 올릴 때 콜백 기능을 호출할 수 있는 해결책이 있습니까?

편집: 콜백 완료, 전화 안 함은 404입니다.404로 된 URL을 원하시면 http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697 로 전화하시면 됩니다. 문제가 있습니다.

$.ajax({
    url: 'http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697',
    dataType: "json",
    success: function(data) {
        alert('success');
    },
    error: function(data) {
        alert('error');
    },
    complete: function(xhr, data) {
        if (xhr.status != 0)
             alert('success');
        else
             alert('fail');
    }
})

구성을 사용하여 jQuery는 jsonp를 사용하여 데이터를 전송합니다.스크립트 요소를 동적으로 삽입하고 URL을 지정된 값으로 설정하여 작동합니다.그러면 서버에서 반환된 데이터는 JavaScript로 평가되며, 일반적으로 제공된 콜백을 호출합니다.서버가 404를 반환하는 경우 내용은 분명히 자바스크립트가 없으며 콜백이 호출되지 않습니다.일부 브라우저는 스크립트 태그에서 오류 처리기를 지원하며, 이러한 상황에서 이를 호출합니다.안타깝게도 IE는 이를 지원하지 않습니다.오류를 탐지하는 가장 좋은 방법은 시간 초과에 의존하는 것입니다.

추가 해야 합니다.timeout옵션 - 콜백이 제때 호출되지 않은 경우(404 응답의 경우) 오류 처리기가 호출됩니다.

$.ajax({
  url: 'http://my_url',
  timeout: 2000, // 2 seconds timeout
  dataType: "json",
  success: function(data){
    alert('success');
  },
  error: function(data){
    alert('error');
  },
  complete: function(data) {
    alert('complete')
  }
});

을 합니다.statusCode

$.ajax({
    url: 'http://my_url',
    dataType: "json",
    statusCode: {
        404: function() {
            alert("I could not find the information you requested.");
        }
    },
    success: function(data) {
      alert('success');
    },
    error: function(data) {
      alert('error');
    },
    complete: function(data) {
      alert('complete');
    }
})

할 때 와 jsonp 로 Twitter API 를 포함해야 .suppress_response_codes당신의 요청 이것이것 트위터 API 모든 응답을로 로 응답하게 합니다하게 .200 OK응답에 오류를 포함합니다..error매개변수 여부.

$.ajax({
  url: "https://api.twitter.com/1/users/show.json",
  dataType: 'jsonp',
  jsonp: "callback",
  data: {
    screen_name: "simongate1337",
    suppress_response_codes: true // <- Important part
  },
  success: function(data) {
    if(data.error) {
      console.log("ERROR: "+data.error);
    } else {
      console.log("Success, got user " + data.screen_name);
    }
  }
});

문제가 dataType 때문이 아니라 도메인 간에 요청할 수 없는 요청 때문이라고 생각하지 않습니까?

아래 코드는 동일한 도메인에서 데이터를 요청할 때 예상대로 작동하고 도메인 간 요청을 할 때는 그렇지 않습니다.

function handle404(xhr){
    alert('404 not found');
}

function handleError(xhr, status, exc) {
     // 0 for cross-domain requests in FF and security exception in IE 
    alert(xhr.status);
    switch (xhr.status) {
        case 404:
            handle404(xhr);
            break;
    }
}

function dumbRequest() {
    var url = 'http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697';
    url = 'http://twitter.com/';    
    url = '/mydata.json';    
//    url = 'mydata.json';    
    $.ajax(
        {url: url,
         dataType: 'json',
         error: handleError}
    );
}

그것은 단순히 그들이dataType"제이슨"으로 설정되어 있습니까?그렇다면 다음으로 변경해 보십시오.textJSON을 직접 평가합니다.

$.ajax({
    url: 'http://twitter.com/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697',
    dataType: 'text',
    success: function(data, status, xmlHttp) {
        try {
            data = eval('(' + data + ')');
            alert('success');
        } catch (e) {
            alert('json parse error');
        }
    },
    error: function(xmlHttp, status, error) {
        alert('error');
    },
    complete: function(xmlHttp, status) {
        alert('complete');
    }
});

HTTP 상태가 404인데도 실제 본체는 유효한 JSON이라는 것을 알고 계십니까?예를 들어, 링크에는 다음과 같은 JSON이 있습니다.

jsonp1269278524295({"request":"/status/user_timeline/jksqdlmjmsd.json?count=3&callback=jsonp1269278524295&_=1269278536697","error":"Not found"})

따라서 데이터에 다음과 같은 정보가 있는지 확인해야 합니다.error일반 콜백 함수 내의 속성입니다.

업데이트: 페이지의 실제 내용이 유효한 JSON임에도 불구하고 브라우저(Firefox에서 확인)가 실행되지 않는 것은 아마도 404이기 때문일 것입니다.왜냐하면 jQuery는 추가해야하기 때문입니다.script요소(도메인 간 문제로 인해) JSONP 래퍼가 호출되지 않으며, 결과적으로 콜백도 수행하지 않습니다.

따라서 간단히 말해, 해당 스크립트 요소를 수동으로 추가하고 사전 정의된 콜백 기능이 나중에 호출되었는지 확인하지 않고는 이 문제를 해결할 방법이 없다고 생각합니다.

동일한 문제에 직면하여 jQuery-JSONP(jQuery Plugin)가 404개의 오류를 잡는 것을 지원한다는 과 그들이 설명하는 "네트워크 장애 또는 잘못된 형식의 JSON 응답의 경우 오류 복구"라는 또 다른 질문을 보았습니다.

그리고 완벽하게 작동합니다 :)

다음은 JSONP를 통해 YouTube 비디오에 대한 세부 정보를 가져오는 (간소화된) 코드입니다.

$.jsonp(
{
    url: "https://gdata.youtube.com/feeds/api/videos/ee925OTFBCA",
    callbackParameter: "callback",
    data: 
    {
        alt: "jsonc-in-script",
        v: "2"
    },
    success: function(json, textStatus) 
    { 
        console.log("WEEEEEEEE!"); 
    },
    error: function(xOptions, textStatus) 
    {
        console.error(arguments);
    }
});

제가 이 문제를 해결하는 방법은 이렇습니다.저는 반환된 데이터를 사용하기 전에 오류가 있는지 확인합니다.아래에 나와 있는 것은 단지 당신의 요구사항에 좀 더 부합하도록 확장할 수 있는 샘플일 뿐입니다.여기에는 세션 제한 시간 및 기타 시나리오도 고려됩니다.

내 첫 통화:

  $.ajax({ type: 'POST', 
    url: '../doSomething',
    data: 'my data',
    success: function(data) {
      if (HasErrors(data)) return;
      var info = eval('(' + data + ')');
      // do what you want with the info object
    },
    error: function(xmlHttpRequest) {
      ReportFailure(xmlHttpRequest);
    }
  });

그리고 두 도우미 기능은 다음과 같습니다.

function HasErrors(data) {
  if (data.search(/login\.aspx/i) != -1) {
    // timed out and being redirected to login page!
    top.location.href = '../login.aspx';
    return true;
  }
  if (data.search(/Internal Server Error/) != -1) {
    ShowStatusFailed('Server Error.');
    return true;
  }
  if (data.search(/Error.aspx/) != -1) {
    // being redirected to site error reporting page...
    ShowStatusFailed('Server Error. Please try again.');
    return true;
  }
  return false;
}

그리고.

function ReportFailure(msg) {
  var text;
  if (typeof msg == 'string') {
    text = msg;
  }
  else if (typeof msg.statusText == 'string') {
    if (msg.status == 200) {
      text = msg.responseText;
    }
    else {
      text = '(' + msg.status + ') ' + msg.statusText + ': ';
      // use the Title from the error response if possible
      var matches = msg.responseText.match(/\<title\>(.*?)\<\/title\>/i);
      if (matches != null)
      { text = text + matches[1]; }
      else
      { text = text + msg.responseText; }
    }
  }
  // do something in your page to show the "text" error message
  $('#statusDisplay')
    .html('<span class="ui-icon ui-icon-alert"></span>' + text)
    .addClass('StatusError');
}

다음 솔루션은 잘 작동합니다 :)

$.ajax({
    url: 'http://my_url',
    dataType: "json",
    success: function(data){
      alert('success');
    },
    error: function(data){
      alert('error');
    },complete: function(xhr, data) {
        if(data==="parsererror"){
             alert('404');
        }
    } 
});

언급URL : https://stackoverflow.com/questions/2493974/how-to-callback-a-function-on-404-in-json-ajax-request-with-jquery