2017-03-20 1 views
0

아주 멍청한 질문이지만, 아래 코드에서 HttpPost (HttpPost를 실행할 수 있음)와 HttpGet을 사용할 수없는 이유를 완전히 이해할 수 없습니다. 누군가 설명해 주시겠습니까?POST 대신 GET을 사용할 수없는 이유는 무엇입니까?

[HttpPost] 
     public ActionResult checkNumFocuses() 
     { 
      //stuff happening 

      if (count == 3) 
      { 
       return Json(false); 
      } 
      else 
      { 
       return Json(true); 
      } 

     } 

위의 내용은 true/false를 반환하는 나의 동작 방법입니다.

는 프런에 아약스 호출입니다 :

$.ajax({ 
     type: "POST", 
     url: '@Url.Action("checkNumFocuses", "Home")', 
     dataType: "json", 
     success: successFunc, 
     error: errorFunc 
}); 
function successFunc(data, status) { 
    if (data == false) { 
     $(".alert").show(); 
     $('.btnfc').addClass('disabled');   
    } 
} 

내가 HttpPost 속성을 삭제 (그래서 기본적으로 GET이다)과 POST에서 아약스 호출 유형을 변경하면 나는 undertant없는 이유를 얻을 수 있습니다 .

+1

삭제하면 어떻게됩니까? 이 점에 대해서는 분명치 않습니다. – tadman

+0

GET을 사용할 수 있습니다. 무엇이 효과가 있습니까? –

+0

만약 내가 그것을 삭제하고 타입이 GET되도록 앞 부분을 변경하면 에러 함수가 실행됩니다. 그렇지 않으면 내가 붙여 넣은 방식으로 작동합니다. –

답변

4

예. Json을 GET 메서드에서 반환 할 수 있습니다. 그러나 JsonRequestBehavior 열거 형을 사용하는 Json 메서드 오버로드를 사용해야합니다.

여기 GET 조치 방법에서 json 데이터를 반환하겠다는 것이 명시되어 있습니다. 당신이합니다 (JsonRequestBehavior 열거 값을 specifiying없이 )를 GET 액션 메소드에서 JSON 데이터를 반환하려고하기 때문에

public ActionResult checkNumFocuses() 
{ 
    //stuff happening 
    if (count == 3) 
    { 
     return Json(false,JsonRequestBehavior.AllowGet); 
    } 
    else 
    { 
     return Json(true,JsonRequestBehavior.AllowGet); 
    } 
} 

현재 당신은 500 오류 응답 (유효 데이터로 대신 200 OK)를 받고있다. 응답이 200 OK가 아니기 때문에, Ajax 호출의 오류 핸들러 부분으로갑니다.

이상적으로 GET 작업은 멱등 숫자이어야합니다. 즉, 실행 횟수와 관계없이 데이터를 변경하면 안됩니다 (). 동일한 응답을 반환합니다. 귀하의 경우, 귀하의 방법은 데이터를 udpating하지 않습니다. 따라서 사람들이 브라우저 탭에서이 URL에 액세스하여 결과를 볼 수있는 한 GET 메소드로 유지할 수 있습니다.

일반적으로 GET 메서드는 뷰/뷰 응답 (마크 업)을 반환해야하며 일반적으로 POST 메서드는 게시 된 양식 데이터/아약스 데이터에서 일부 처리를 수행합니다 (예 : 일부 업데이트 데이터 등)을 입력하고 응답을 반환합니다. JSON입니다. 당신이 정말로 당신의 GET 액션 메소드에서 JSON 데이터를 반환 할 경우에, 당신은 명시 적으로 우리가

물론

을했던 위의 방법을 사용하여, 웹 API의이 (장면 뒤에 구현) 다른 개념

+0

감사합니다. 그러나 어쨌든이 두 경우 중 어느 것이이 경우에 사용되는 것이 가장 좋습니까? 그리고 왜? –

+1

이 경우 응답에서 언급 한 오버로드 i와 함께 GET을 사용할 수 있습니다.(당신이 탭에서 URL에 직접 액세스하여 결과를 보는 사람들은 괜찮다고 가정) – Shyju

+1

자세한 답변을 주셔서 대단히 감사합니다. :) –

1
을 가지고 지정해야

GET을 사용할 수 있습니다. 그러나 GET을 허용해야합니다. JsonRequestBehavior

[HttpGet] 
public ActionResult checkNumFocuses() 
{ 
    .... 
    return Json(true, JsonRequestBehavior.AllowGet); 
} 
+0

감사. 그러나 어쨌든이 두 경우 중 어느 것이이 경우에 사용되는 것이 가장 좋습니까? 그리고 왜? –

+1

메소드에서 데이터를 변경하는 경우 (예 : 데이터베이스 업데이트) POST 여야합니다. 그렇지 않으면 둘 중 하나 일 수 있습니다. –

+0

기존 레코드를 업데이트하려면 PUT 또는 PATCH 중 하나를 사용해야합니다. POST는 새로운 레코드를 만들기위한 것이어야합니다. –

관련 문제