source

MVC 컨트롤러: HTTP 본문에서 JSON 개체를 가져오시겠습니까?

ittop 2023. 3. 8. 21:47
반응형

MVC 컨트롤러: HTTP 본문에서 JSON 개체를 가져오시겠습니까?

MVC(MVC4) 어플리케이션이 있어 서드파티에서 특정 URL(http://server.com/events/)로 전송되는 JSON 이벤트를 수신할 수 있습니다.JSON 이벤트는 HTTP POST 본문에 있으며 본문은 엄밀하게 JSON입니다(Content-Type: application/json- 일부 문자열 필드에 JSON이 포함된 폼 포스트가 아닙니다).

컨트롤러 본체에 JSON 본체를 삽입하려면 어떻게 해야 하나요?나는 다음을 시도했지만 아무것도 얻지 못했다.

[편집] : 아무것도 얻지 못했다는 것은 json Body를 다음과 같이 정의해도 항상 무효라는 것을 의미합니다.Object또는string.

[HttpPost]
// this maps to http://server.com/events/
// why is jsonBody always null ?!
public ActionResult Index(int? id, string jsonBody)
{
    // Do stuff here
}

declarge 메서드에 강한 입력 파라미터를 지정하면 MVC는 전체 해석과 필터링을 수행합니다.

// this tested to work, jsonBody has valid json data 
// that I can deserialize using JSON.net
public ActionResult Index(int? id, ClassType847 jsonBody) { ... }

그러나 JSON은 매우 다양하기 때문에 각 JSON 변형에 대해 수백 개의 서로 다른 클래스를 정의(유지)하고 싶지 않습니다.

나는 이것을 다음과 같이 테스트하고 있다.curl명령어(여기서1개의 JSON을 사용)

curl -i -H "Host: localhost" -H "Content-Type: application/json" -X POST http://localhost/events/ -d '{ "created": 1326853478, "data": { "object": { "num_of_errors": 123, "fail_count": 3 }}}

인 것 같다

  • Content-Type: application/json그리고.
  • POST 본문이 컨트롤러의 입력 객체 클래스에 단단히 바인딩되어 있지 않은 경우

그러면 MVC는 POST 본문을 특정 클래스에 바인드하지 않습니다.또한 POST 본문을 ActionResult의 파라미터로 취득할 수도 없습니다(다른 답변으로 제안).그럴 만도대체로.요청 스트림에서 직접 가져와 처리해야 합니다.

[HttpPost]
public ActionResult Index(int? id)
{
    Stream req = Request.InputStream;
    req.Seek(0, System.IO.SeekOrigin.Begin);
    string json = new StreamReader(req).ReadToEnd();

    InputClass input = null;
    try
    {
        // assuming JSON.net/Newtonsoft library from http://json.codeplex.com/
        input = JsonConvert.DeserializeObject<InputClass>(json)
    }

    catch (Exception ex)
    {
        // Try and handle malformed POST body
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }

    //do stuff

}

업데이트:

ASP용입니다.Net Core, 추가하셔야 합니다.[FromBody]복잡한 JSON 데이터 유형의 컨트롤러 액션에서 파라미터 이름 옆에 있는 속성:

[HttpPost]
public ActionResult JsonAction([FromBody]Customer c)

또한 요청 본문에 스트링으로 접근하여 직접 해석하려면Request.Body대신Request.InputStream:

Stream req = Request.Body;
req.Seek(0, System.IO.SeekOrigin.Begin);
string json = new StreamReader(req).ReadToEnd();

사용하다Request.Form데이터를 입수하다

컨트롤러:

    [HttpPost]
    public ActionResult Index(int? id)
    {
        string jsonData= Request.Form[0]; // The data from the POST
    }

시험삼아 이 글을 씁니다.

표시:

<input type="button" value="post" id="btnPost" />

<script type="text/javascript">
    $(function () {
        var test = {
            number: 456,
            name: "Ryu"
        }
        $("#btnPost").click(function () {
            $.post('@Url.Action("Index", "Home")', JSON.stringify(test));
        });
    });
</script>

써넣다Request.Form[0]또는Request.Params[0]데이터를 가져올 수 있습니다.

나는 글을 쓰지 않는다.<form> tag시야에.

ASP를 받으려고 노력했어요.NET MVC 컨트롤러는 Postman을 사용하여 제출한 모델을 해석합니다.

작동시키기 위해서는 다음 사항이 필요했습니다.

  • 컨트롤러 동작

    [HttpPost]
    [PermitAllUsers]
    [Route("Models")]
    public JsonResult InsertOrUpdateModels(Model entities)
    {
        // ...
        return Json(response, JsonRequestBehavior.AllowGet);
    }
    
  • 모델 클래스

    public class Model
    {
        public string Test { get; set; }
        // ...
    }
    
  • 특히, 우체부의 요청에 대한 헤더입니다.Content-Type

    우편 배달부 헤더

  • 요청 본문의 json

    여기에 이미지 설명 입력

받을 것을 나타내는 클래스(MyDTOClass)를 정의하면 다음과 같이 간단합니다.

public ActionResult Post([FromBody]MyDTOClass inputData){
 ... do something with input data ...
}

Thx에서 Julias로:

Json의 해석넷 웹 API

요청이 http 헤더와 함께 전송되었는지 확인합니다.

콘텐츠 유형: 응용 프로그램/json

은 json param의 수 .ActionResult그 후 JSON을 사용하여 연재합니다.

여기에서는 예를 제시하겠습니다.


컨트롤러 액션의 파라미터로 시리얼화된 형식으로 수신하려면 커스텀모델 바인더 또는 액션필터(OnAction)를 작성해야 합니다.실행 중)을 사용하면 json 문자열이 원하는 모델에 직렬화되어 컨트롤러 본체 내에서 사용할 수 있습니다.


다음은 동적 개체를 사용한 구현입니다.

언급URL : https://stackoverflow.com/questions/13041808/mvc-controller-get-json-object-from-http-body

반응형