Ajax 요청은 200 OK를 반환하지만 성공 대신 오류 이벤트가 발생합니다.


805

내 웹 사이트에서 Ajax 요청을 구현했으며 웹 페이지에서 엔드 포인트를 호출하고 있습니다. 항상 200 OK 반환 하지만 jQuery 는 오류 이벤트를 실행합니다.
나는 많은 것을 시도했지만 문제를 파악할 수 없었다. 아래 코드를 추가하고 있습니다 :

jQuery 코드

var row = "1";
var json = "{'TwitterId':'" + row + "'}";
$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});
function AjaxSucceeded(result) {
    alert("hello");
    alert(result.d);
}
function AjaxFailed(result) {
    alert("hello1");
    alert(result.status + ' ' + result.statusText);
}

에 대한 C # 코드 JqueryOpeartion.aspx

protected void Page_Load(object sender, EventArgs e) {
    test();
}
private void test() {
    Response.Write("<script language='javascript'>alert('Record Deleted');</script>");
}

("Record deleted")성공적인 삭제 후 문자열이 필요합니다 . 내용을 삭제할 수 있지만이 메시지가 나타나지 않습니다. 이것이 맞습니까? 아니면 잘못된 일이 있습니까? 이 문제를 해결하는 올바른 방법은 무엇입니까?


2
JSON 유효성 검사기를 통해 JqueryOperation.aspx의 출력을 실행하고 JSON 유효성 검사기가 유효한지 확인할 수 있습니까
parapura rajkumar

1
jsonlint.com 처럼 . 또한 전송 한 파라미터를 확인해야합니다. 현재 매개 변수 이름을 설정하지 않았습니다. 매개 변수가 TwitterId인 경우 data문자열이 아닌에 객체를 전달해야합니다 data: {TwitterId: row}.
Felix Kling

6
Jqueryoperation.aspx 페이지가 (유효한) JSON을 반환합니까?
살만 A

1
아마도 서버 측 코드에서 예외가 발생했을 것입니다. 응답으로 catch 블록에서 무엇이 돌아가고 있습니까?
Raghav

3
@Raghav, 서버에서 요청 처리 예외가 발생하면 HTTP 리턴 코드는 500이됩니다.
StuperUser

답변:


1118

jQuery.ajax지정된 dataType매개 변수 또는 Content-Type서버가 보낸 헤더 에 따라 응답 본문을 변환하려고 시도 합니다. 변환이 실패하면 (예 : JSON / XML이 유효하지 않은 경우) 오류 콜백이 시작됩니다.


AJAX 코드에는 다음이 포함됩니다.

dataType: "json"

이 경우 jQuery :

응답을 JSON으로 평가하고 JavaScript 객체를 반환합니다. […] JSON 데이터는 엄격한 방식으로 구문 분석됩니다. 잘못된 JSON이 거부되고 구문 분석 오류가 발생합니다. […] 빈 응답도 거부됩니다. 서버는 널 또는 {}의 응답을 대신 리턴해야합니다.

서버 측 코드는 200 OK상태 와 함께 HTML 스 니펫을 반환 합니다. jQuery는 유효한 JSON을 기대하고 있으므로에 대해 불평하는 오류 콜백을 발생시킵니다 parseerror.

해결책은 dataTypejQuery 코드에서 매개 변수 를 제거 하고 서버 측 코드를 반환하는 것입니다.

Content-Type: application/javascript

alert("Record Deleted");

그러나 JSON 응답을 반환하고 성공 콜백 내에 메시지를 표시하는 것이 좋습니다.

Content-Type: application/json

{"message": "Record deleted"}

1
귀하의 응답에 감사드립니다. 코드 뒤에 json 값을 반환하는 방법을 알려주십시오. C #과 함께 Asp.net을 사용하고 있습니다. 이렇게하면 내 문제가 해결되었지만이 사실도 알려주십시오.
Pankaj Mishra

1
@ Panjaj : 다른 질문으로 게시하면 더 좋습니다. 그러나 짧은 대답 : 이것을 수행하는 두 가지 방법 (i) 대신 $.ajax시도 할 수 있습니다 $.getScript. 서버 측 C # 스크립트 안에 alert('Record Deleted');( <script>태그 없음 )을 넣고 C # 스크립트 의 ContentType을로 설정하십시오 text/javascript. $.ajax또한 작동 할 수는 있지만 어떻게 기억해야합니까? 변경해야 할 수도 있습니다 dataType: 'script',. 더 이상 성공 처리기가 필요하지 않을 수 있습니다.
살만 A

3
이 답변은 완전하지 않을 수 있습니다. 방금 jsonlint.com에서 JSON의 유효성을 검사 한 결과 jsonlint.com에서 명시 적으로 사용 가능한 json이지만 xhr.status 200과 함께 여전히 "오류"이벤트가 발생합니다. 다른 이유는 무엇입니까? – Ramesh Pareek 방금 편집
Ramesh Pareek

2
또는 "dataType : json"파라미터
Piero Alberto

1
을 사용할 때 데이터 유형을 지정하지 않고이 동일한 문제가 발생했습니다 $.post. 이 경우 jquery는 데이터 유형을 추측 한 다음 구문 분석에 실패하면 오류를 발생시킵니다 . 이것은 정말 불쾌하고 찾기 어려운 문제입니다. 데이터 유형을로 설정하여 수정했습니다 "text".
Mashmagar

31

여러 개의 공백으로 구분 된 dataType( jQuery 1.5+ ) 를 사용하면 행운이 있습니다. 에서처럼 :

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'text json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

1
JQuery 문서를 기반으로, 마찬가지로 "jsonp xml"과 같은 속기 문자열은 먼저 jsonp에서 xml로 변환을 시도하고 실패하면 jsonp에서 텍스트로 변환 한 다음 텍스트에서 xml로 변환을 시도합니다. 그래서 먼저 텍스트를 json에 은닉하려고 시도하고 실패하면 텍스트로 취급됩니까?
IBMer

29

AJAX 호출에서 dataType : "json" 을 제거하기 만하면됩니다 .

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: json,
    dataType: 'json', //**** REMOVE THIS LINE ****//
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

22

이것은 OP와 비슷한 내 문제에 대한 해결책을 찾을 때이 게시물에 부딪 혔기 때문에 기록에 불과합니다.

필자의 경우 Chrome의 동일한 출처 정책 으로 인해 jQuery Ajax 요청이 성공하지 못했습니다 . 서버 (Node.js)를 수정하면 모든 것이 해결되었습니다.

response.writeHead(200,
          {
            "Content-Type": "application/json",
            "Access-Control-Allow-Origin": "http://localhost:8080"
        });

말 그대로 벽에 머리를 두드리는 데 1 시간이 걸렸습니다. 바보 같아 ...


1
고마워 Peter, 나는 같은 문제가 있었고 브라우저 콘솔의 경고 메시지가 혼란스러워했다. 내가 CORS가 보내기 요청을 차단하는 것을 아는 한 (옵션 메소드 협상을 사용하여) 작업이 완료된 후 해당 블록이 의미가 없습니다. 어쩌면 사용자 정의 브라우저 동작입니다. Firefox에서 테스트했습니다. 감사합니다. 솔루션이 내 문제를 해결했습니다.
danipenaperez 2016 년

15

aspx 페이지가 JSON 객체를 반환하지 않는다고 생각합니다. 귀하의 페이지는 이와 같은 작업을 수행해야합니다 (page_load)

var jSon = new JavaScriptSerializer();
var OutPut = jSon.Serialize(<your object>);

Response.Write(OutPut);

또한 AjaxFailed를 변경하십시오.

function AjaxFailed (XMLHttpRequest, textStatus) {

}

textStatus 발생하는 오류 유형을 알려줘야합니다.


12

업데이트 된 jQuery 라이브러리 에서이 문제에 직면했습니다. 서비스 방법이 아무것도 반환하지 않으면 반환 유형이void 입니다.

그런 다음 Ajax 전화에서 언급하십시오. dataType='text' .

문제가 해결됩니다.


8

당신은 단지 제거해야 dataType: 'json'구현 된 웹 서비스 메소드가 void 인 경우 헤더에서 하면됩니다.

이 경우 Ajax 호출에는 JSON 반환 데이터 유형이 없을 것으로 예상됩니다.


4

다음 코드를 사용하여 응답이 JSON 형식 (PHP 버전)인지 확인하십시오.

header('Content-Type: application/json');
echo json_encode($return_vars);
exit;

4

나는 같은 문제가 있었다. 내 문제는 컨트롤러가 JSON 대신 상태 코드를 반환하는 것이 었습니다. 컨트롤러가 다음과 같은 것을 반환하는지 확인하십시오.

public JsonResult ActionName(){
   // Your code
   return Json(new { });
}

3

비슷한 문제가 있지만 'json'데이터 유형을 제거하려고 할 때 여전히 문제가 있습니다. 성공 대신 내 오류가 실행 중입니다.

function cmd(){
    var data = JSON.stringify(display1());
    $.ajax({
        type: 'POST',
        url: '/cmd',
        contentType:'application/json; charset=utf-8',
        //dataType:"json",
        data: data,
        success: function(res){
                  console.log('Success in running run_id ajax')
                  //$.ajax({
                   //   type: "GET",
                   //   url: "/runid",
                   //   contentType:"application/json; charset=utf-8",
                   //   dataType:"json",
                   //   data: data,
                   //  success:function display_runid(){}
                  // });
        },
        error: function(req, err){ console.log('my message: ' + err); }
    });
}

나는 똑같은 것을보고있다. 200 코드의 빈 응답으로 여전히 오류 처리기가 트리거됩니다.
doublejosh

2

나를 위해 엉망이 된 또 다른 것은 localhost127.0.0.1 대신 또는 그 반대로 사용하는 것이 었습니다 . 분명히 JavaScript는 한 요청에서 다른 요청을 처리 할 수 ​​없습니다.


2

이것을보십시오 . 그것도 비슷한 문제입니다. 내가 노력했다.

제거하지 마십시오 dataType: 'JSON',

참고 : PHP 에코 만 사용하는 경우 PHP 파일에서 JSON 형식 만 반향하십시오. 아약스 코드 반환 200


1

나는 같은 문제가 있었다. 내 JSON 응답에 특수 문자가 포함되어 있고 서버 파일이 UTF-8로 인코딩되지 않았기 때문에 Ajax 호출은 이것이 유효한 JSON 응답이 아닌 것으로 간주했습니다.


1

항상 서버에서 JSON을 반환하면 (빈 응답 없음) dataType: 'json'작동해야하며 contentType필요하지 않습니다. 그러나 JSON 출력을 확인하십시오 ...

jQuery AJAX는 유효하지만 직렬화되지 않은 JSON에서 'parseerror'를 발생시킵니다!


-1

스크립트는 JSON 데이터 형식의 반환을 요구합니다.

이 시도:

private string test() {
  JavaScriptSerializer js = new JavaScriptSerializer();
 return js.Serialize("hello world");
}

-9

다음을 시도하십시오

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow',
    contentType: 'application/json; charset=utf-8',
    data: { "Operation" : "DeleteRow", 
            "TwitterId" : 1 },
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

또는

$.ajax({
    type: 'POST',
    url: 'Jqueryoperation.aspx?Operation=DeleteRow&TwitterId=1',
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    cache: false,
    success: AjaxSucceeded,
    error: AjaxFailed
});

JSON 객체에서 작은 따옴표 대신 큰 따옴표를 사용하십시오. 이것이 문제를 해결할 것이라고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.