2014-06-12 17 views
1

문제가 직접적으로 다이빙합니다.Web Api 및 AngularJs

팩토리에서 정의 된 함수를 호출하는 angularJs 컨트롤러가 있습니다. 팩토리 함수는 '[FromBody] 문자열'매개 변수를 받아들이는 Api POST 액션을 호출합니다. 여기에서 문제가 정확히 제기되었습니다. 사실, 매개 변수는 항상 null입니다! factory 메소드 내부에는 원하는 값이 있습니다. 다음 코드 비트는 다음

AngularJS와 컨트롤러 :

$scope.readText = function() { 

     var element = document.getElementsByClassName('news-content'); 

     if (element[0] != undefined) { 
      elementPureText = element[0].innerText; 
     } 

     dataFactory.createTextFile(elementPureText) 
      .succes(function(data, status, headers, config) { 

      }).error(function(data, status, headers, config) { 

      }); 
    }; 

공장 번호 :

philadelphiaApp.factory('dataFactory', ['$http', function ($httpt) { 

var dataFactory = {}; 

dataFactory.createTextFile = function (text) { 
    return $httpt.post('api/textmanager/textWriter', { '': text }); 
}; 

return dataFactory; 

}]);

그리고 마지막으로 ApiController

:

[HttpPost] 
    [ActionName("TextWriter")] 
    public HttpResponseMessage PostTextWriter([FromBody]string text) 
    { 
     if (String.IsNullOrEmpty(text) || text.Length == 0) 
     { 
      throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest)); 
     } 

     if (!Directory.Exists(FileDirectory)) 
     { 
      try 
      { 
       Directory.CreateDirectory(FileDirectory); 
      } 
      catch (Exception) 
      { 

       throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest)); 
      } 
     } 

     try 
     { 
      File.WriteAllText(FileDirectory, text); 
     } 
     catch (Exception) 
     { 
      throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest)); 
     } 

     return Request.CreateResponse(HttpStatusCode.OK, text); 
    } 

방문하고 내가 포럼 및 솔루션을 제공하는 웹 사이트의 많은 통해 제공되는 웹을 통해 검색 한 후하지만 나는 아직 그것을 처리 할 수 ​​있습니다. 내가보기 엔이에 어떤 도움을 주셔서 감사합니다

http://encosia.com/using-jquery-to-post-frombody-parameters-to-web-api/

...

답변

0

실제로 나는 고생 한 후에 대답을 찾았습니다. 간단히 Content-Type을 추가하면 웹 API 클라이언트 쪽에서 application/json이 호출됩니다. 솔루션을 제공 한 사람들에게 감사드립니다.

0

당신은 ''라는 이름의 필드 객체를 통해 전송된다 (빈 문자열 : I는 중 최고는 다음 URL 가정)와 텍스트의 가치. 그러나 webapi 백엔드는 문자열이 아니라 객체를 기대합니다. 오브젝트를 캐릭터 라인에 직렬화 복원 할 수 없기 때문에, null가됩니다.

문자열을 직접 보내고 객체에 채워 넣지 않아야합니다. 이처럼 :

return $httpt.post('api/textmanager/textWriter', text); 
+0

감사합니다. 이전에는했지만 여전히 NULL 값이었습니다. 사실, 내가 언급 한 URL (내 질문 내에서)에 제안 된대로 개체를 보냈습니다 – Ali

1

문제는 데이터가 인코딩되는 방식과 관련이있다, 어떻게 WebAPI 백 엔드에 그 직렬화하기 위해 노력하고있다.

기본적으로 $httpcontent-type:application/json과 함께 모든 POST 요청을 전달하며 사용자의 방식으로 데이터를 시도하고 인코딩하려고 시도합니다. content-typetext/plain과 같은 것으로 설정할 수는 있지만이를 처리 할 수있는 WebAPI 용 사용자 지정 미디어 포맷터가 필요합니다.

public class TextWriterRequest 
{ 
    public String Text { get; set; } 
} 

그리고 입력으로 해당 객체를 받아들이는 당신의 방법을 수정 : 여기에 최소한의 저항

경로는 다음과 같이 간단한 요청 개체를 만드는 것입니다. WebAPI가 기본적으로 본문의 복잡한 객체를 찾을 것이므로 [FromBody]을 사용할 필요가 없습니다.

public HttpResponseMessage PostTextWriter(TextWriterRequest text) 

그런 다음 당신은 당신의 데이터가 전달되는 지 확인하세요 $http 서비스를 통해 요청 객체와 일치 할 수

$http({ 
    method: 'POST', 
    url: '/api/textmanager', 
    data: { text: text } 
}); 

이 서비스에 올바르게 역 직렬화되며, 생활은 다시 한 번 좋은 것입니다.

+0

글쎄, 당신이 제안한 것은 합리적인 해결책 인 것 같지만, 제 코드에서는 작동하지 않는다고 말하는 것이 유감입니다 ... 샘플 애플 리케이션에서 일하고 완전히 아이디어에서 올라오고있다. 나는 처음부터 새로운 솔루션을 만들 것이고 아마도 그것을 알아낼 수있을 것이다. – Ali

+0

@AliAshoori - 이것은 나에게 이상하게 보입니다. 주로 예상대로 작동하는지 확인하기 전에 실제로 솔루션을 만들었 기 때문입니다. – Josh