3

을받지 못했습니다.ASP.Net 웹 API이 속성 라우팅 HTTP의 POST 액션은 내가 간단한 ASP.Net 웹 API이 컨트롤러가 올바른 매개 변수

<form action="/api/method/" method="post"> 
    <input type="text" name="msg" value="Tim" /> 
    <input type="submit" /> 
</form> 

페이지를로드하고 양식을 제출하면 결과 문자열은 "hello John"입니다. 양식의 방법을 post에서 get으로 변경하면 결과는 "hello Tim"으로 변경됩니다. 컨트롤러에 게시 할 때 msg 매개 변수가 작업으로 라우팅되지 않은 이유는 무엇입니까? 는 HTTP GET가 산만

은 ========== EDIT 1 ==========

는에-경우 그냥-, 컨트롤러의이 버전은 또한받을 실패 게시 된 양식에서 올바른 msg 매개 변수 :

[Route("api/method/{msg?}")] 
[HttpPost] 
public string Method(string msg = "John") 
{ 
    return "hello " + msg; 
} 

가 ========== 편집 2 ==========

내가 기본 경로를 변경하지 않은 그래도 다음과 같이 보입니다.

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.MapHttpAttributeRoutes(); 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 
+0

다음이 HTML Form[FromBody] 속성을 사용하지 않고, 시도 사용하려는 경우? 일반적으로 GET은 자원을 검색하는 데 사용되고 UPDATE/POST는 자원을 수정하는 데 사용됩니다. 그 맥락에서 두 가지 동사를 모두 받아들이는 방법은별로 의미가 없습니다. 내기를 헤지해야한다면 두 가지 방법을 분리해도 문제가되지 않을 것입니다. – BenjaminPaul

+0

실제 앱은 POST 만 사용하지만 GET을 사용하면 브라우저에 URL로 붙여 넣기가 더 쉽습니다. 차별화 할 좋은 이유가 없다면 나는 귀찮게하지 않습니다. – dumbledad

+0

당신은 REST 원리의 위반을 고려하지 않는다면 좋은 이유는 아닙니다. 나는 그렇게 할 것입니다! – BenjaminPaul

답변

4

POST의 매개 변수는 html form을 사용하는 경우 상자에서 deserialize되지 않습니다. Use the [FromBody] attribute 값을 얻으려면 msg을 입력하십시오.

[HttpPost] 
[Route("api/method")] 
public string Method([FromBody] string msg) 
{ 
    return "hello " + msg; 
} 

그렇지 않으면 당신은 POST 메서드 호출을하고 쿼리 문자열로 msg을 통과 Fiddler (또는 유사한 웹 디버거)를 사용해야합니다.

당신이 정말로 왜 모두 GET과 POST 요청에 대해 동일한 방법을 사용하고, 관심 부족

[HttpPost] 
[Route("api/method")] 
public string Method() 
{ 
    var msg = Request.Content.ReadAsFormDataAsync(); 
    var res= msg.Result["msg"]; 
    return "hello " + res ; 
} 
+2

고마워. 흥미롭게도'[FromBody]'는 선택적 매개 변수로 작동하지 않는 것 같습니다. 예 : 코드를 'public string Method ([FromBody] string msg = "John")로 변경하면 "InvalidOperationException"메시지와 함께 호출이 실패합니다. "Optional parameter'msg '는'FormatterParameterBinding '에서 지원하지 않습니다." – dumbledad

+1

I 옵션의 단순한 타입 매개 변수를 사용하는'[FromBody]'의 해결 방법은 옵션 매개 변수에 대한 값을 가지고 있는지 여부에 따라 선택적으로하지 않고 요청 본문을 구조화하는 것입니다 : '= stringvalue' 그러면' msg'는 WebAPI에서''stringvalue ''가됩니다. 'msg ='그러면'msg'은 WebAPI에서'null'이됩니다. 컨트롤러 메서드 내에서 기본값 "John"을 정의해야하지만 이는 InvalidOperationException을 제거합니다. 'Content-Type' 헤더를'application/x-www-form-urlencoded'로 설정하는 것을 잊지 마십시오. – jhiller