2013-04-18 3 views
1

jQuery ajax 메서드를 사용하여 데이터베이스에서 데이터를 가져 와서 페이지의 일부 컨트롤에 바인딩하는 간단한 Webservice를 호출하는 페이지가 있습니다. ajax 메소드는 onchange select (여기서 HTTP 요청은 POST 임) 이벤트에서 호출됩니다. JQuery와 AJAX 방식jQuery Ajax 메서드로 처리 오류 처리

function CallAjax(url, jsonData, SucessFunction, FailurFunction) { 
$.ajax({ 
    type: "POST", 
    url: url, 
    data: jsonData, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: SucessFunction, 
    error: function(){ 
     alert('error occured'); 
    } 
}); 

}

상기 방법에 대한 URL이 getDataFromDatabse는 웹 서비스 방법이다 somepage.aspx/getDataFromDatabse되어있다 이어. 우리의 테스터는 트렁크를 사용하여 페이지를 테스트하고 있습니다. 브라우저에서 직접 URL (www.example.com/somepage.aspx/getDataFromDatabse)에 액세스하려고 할 때 트랩 스위트에 표시된 HTTP 메소드가 GET이고 오류가 발생하고 사용자가 해당 페이지로 리디렉션됩니다. . 그러나 위의 URL에 직접 액세스하여 트립 모드로 요청을 가로 채고 GET 요청을 POST 요청으로 변경하면 다음 오류 메시지가 브라우저에 직접 표시됩니다.

{ "메시지" ","StackTrace ":" ","예외 유형 ":" "}

위의 ajax 함수에서"오류 "가 실행되지 않고 경고 상자가 표시되지 않고 오류를 처리합니다. 이러한 오류를 처리하고 사용자를 사용자 정의 페이지로 리디렉션하는 방법은 무엇입니까?

답변

1

서버에서 보낸 응답이 오류 (사용자)가 읽는 내용이 포함되어 있음에도 불구하고 유효한 JSon 응답 인 것처럼 보입니다. 따라서 $.ajax(...) 호출은 응답이 아니라 오류로 응답을 처리합니다.

유효한 JSON 응답을 반환하고 그 응답에서 추가 정보와 함께 등 사용자 친화적 인 오류 메시지, 리디렉션 URL,

error: 같은 오류가 있었는지의 여부를 나타내는 또는 수 없습니다 $.ajax(...) 호출 핸들러는 실제 서버 응답 오류 (예 : 처리되지 않은 500 오류, 타임 아웃 등) 예를 들어

, 성공적인 JSON 응답이 될 수 사용해야 뭔가 같은 :

{ 
    success: true, 
    errorMessage: null, 
    errorRedirectUrl: null, 
    data: { .... your successful data response .... } 
} 

및 실패한 JSon 응답 (예 : 때문에 검증 문제가 아닌 서버 장애)에 다음과 같이 보일 것이다 :

{ 
    success: false, 
    errorMessage: 'There was an error processing the request.', 
    errorRedirectUrl: 'http://....someurl...', 
    data: null 
} 

그런 다음 당신은 $.ajax(....) 호출의 success: 옵션에 response.success == true을 확인하고 적절하게 처리합니다. 하나의 일관된 구조에게 success: 옵션을 가짐으로써

는 완료 모든 아약스 요청을 처리하고 거기 오류를 처리했고, 사용자에게 같은 디스플레이로, 그것으로 경고를 무엇을해야할지에 리디렉션 여부를 결정 URL 등 ...

대조적으로 error: 옵션은 사용할 수있는 응답으로 돌아 오지 않은 아약스 요청 만 처리합니다.

업데이트 : 서버에

가 이미 GET HTTP 요청과 POST HTTP 요청을 수신 사이의 차이를 취급하고 있습니다. 따라서, 귀하의 문제는 POST 요청에 유효한 데이터가 웹 서비스 메서드에 필요한 형식으로 포함되어 있는지 여부를 감지해야한다는 것입니다.

웹 서비스는 http 요청의 POST 된 데이터가 수신 할 것으로 예상되는 형식인지 그리고 오류를 반환하지 않고 HTTP 리다이렉트 응답 (302)을 반환하지 않는지를 결정해야합니다.

당신은 2 가지 방법으로이 작업을 수행 할 수 있습니다 :

  1. Try... Catch... 블록을 사용. 귀하의 웹 서비스 메서드는 이미 예외를 throw하고 그것을 반환하므로 캐치하고 반환하는 대신 설정하고 302 응답을 반환하는 대신 나타납니다. 일반적인 작업에서 예외를 생성 할 수있는 웹 서비스에

  2. 하면 정품 전화 (이것은 일반적으로 나쁜!) 당신이이 웹 서비스 방법은받을 무엇을 기대하고 있는지 확인하기 위해 요청받은 데이터의 유효성을 검사해야합니다

참고 (? 등이 아약스 요청에 의해 전송되는대로 바로 구조이었다 데이터를 수신했다) : 요청 가하는 경우 다음이 있는지 여부를 감지 할 수있는 쉬운 방법은 없습니다 유효한 데이터를 포함 진짜 소스 (아약스 호출) 또는 다른 수단에 의한 위조 된 요청에서 온 것입니다. 거기에 해결책이지만 연관되어 있으며 인증 등을 위해 여러 번 호출해야 할 수도 있습니다.

+0

ajax 메소드는'select' (dropdownlist) html 컨트롤의'onchange' js 이벤트에서만 호출됩니다. 그러나 서비스 메소드의 URL (www.example.com/somepage.aspx/getDataFromDatabse)이 브라우저에 직접 입력되어 액세스되고 GET 유형이 트랩 제품군을 통해 POST로 변경되면 유효한 JSON 결과가 반환됩니다. 하지만 JSON 결과를 처리하기 위해 jquery ajax 메서드가 호출되지 않고 JSON 결과가 브라우저에서 일반 텍스트로 직접 표시됩니다. 어떻게 처리할까요? – seadrag0n

+0

@ghouse - 브라우저에 URL을 입력 할 때 (그리고 메소드를 POST로 변경하는 경우) jquery'$ .ajax (...)가 호출되지 않으므로 올바르게 이해할 수 없으므로 응답을 듣고. 아마도 나는 당신의 질문을 완전히 이해하지 못하고 있습니까? – Chris

+0

jquery'$ .ajax (...)'는'onchange'에서만 호출되기 때문에 'URL'이 브라우저에서 직접 액세스 될 때 호출되지 않고 GET이 POST로 변경되기 때문에 호출됩니다 JSON 형식으로 위의 메시지를 브라우저에 직접 표시하고 있습니다. – seadrag0n