programing

ApiController 매개 변수에서 복합 유형이 null을 가져오는 중입니다.

madecode 2023. 3. 14. 22:02
반응형

ApiController 매개 변수에서 복합 유형이 null을 가져오는 중입니다.

파라미터 "Parametro Filtro Filtro"가 null이 되고 다른 파라미터 "page" 및 "page Size"가 정상으로 표시되는 이유를 알 수 없습니다.

public class ParametroFiltro
{
    public string Codigo { get; set; }
    public string Descricao { get; set; }
}

My ApiController Get 메서드:

public PagedDataModel<ParametroDTO> Get(ParametroFiltro Filtro, int page, int pageSize)

AJAX 콜:

var fullUrl = "/api/" + self.Api;
$.ajax({
    url: fullUrl,
    type: 'GET',
    dataType: 'json',
    data: { Filtro: { Codigo: '_1', Descricao: 'TESTE' }, page: 1, pageSize: 10 },
    success: function (result) {
        alert(result.Data.length);
        self.Parametros(result.Data);
    }
});

복잡한 개체를 전송하려고 합니다.GET방법.이게 실패하는 이유는GET메서드는 본문을 가질 수 없으며 모든 값이 URL로 인코딩됩니다. 다음을 사용하여 이 작업을 수행할 수 있습니다.[FromUri]단, 먼저 클라이언트 측 코드를 변경해야 합니다.

$.ajax({
    url: fullUrl,
    type: 'GET',
    dataType: 'json',
    data: { Codigo: '_1', Descricao: 'TESTE', page: 1, pageSize: 10 },
    success: function (result) {
        alert(result.Data.length);
        self.Parametros(result.Data);
    }
});

이쪽입니다.[FromUri]액션 방식을 다음과 같이 변경하면는 URL에서 직접 복잡한 오브젝트 속성을 선택할 수 있습니다.

public PagedDataModel<ParametroDTO> Get([FromUri]ParametroFiltro Filtro, int page, int pageSize)

이전 접근방식은 다음 제품과 함께 사용할 수 있습니다.POST본체를 가질 수 있는 방법(그러나 당신은 여전히 사용할 필요가 있다)JSON.stringify()본문을 JSON으로 포맷합니다).

를 제공하다contentType속성을 지정합니다.게시할 JSON 데이터를 빌드하려면 메서드를 사용합니다.활자를 바꾸다POST및 MVC Model 바인딩은 게시된 데이터를 클래스 개체에 바인딩합니다.

var filter = { "Filtro": { "Codigo": "_1", "Descricao": "TESTE" }, 
                                               "page": "1", "pageSize": "10" }; 
$.ajax({
    url: fullUrl,
    type: 'POST',
    dataType: 'json',
    contentType: 'application/json',
    data: JSON.stringify(filter),
    success: function (result) {
        alert(result.Data.length);
        self.Parametros(result.Data);
    }
});

Newtonsoft를 통해 POST 변수에 액세스할 수도 있습니다.Json.Linq JObject.

예를 들어, 이 POST는 다음과 같습니다.

$.ajax({
    type: 'POST',
    url: 'URL',
    data: { 'Note': note, 'Story': story },
    dataType: 'text',
    success: function (data) { }
});

APIController에서 다음과 같이 액세스할 수 있습니다.

public void Update([FromBody]JObject data)
{
    var Note = (String)data["Note"];
    var Story = (String)data["Story"];
}

쿼리 문자열에 json 데이터를 추가하고 나중에 웹 API 측에서 구문 분석하는 경우.복잡한 오브젝트를 해석할 수도 있습니다.특별한 httpget 요건의 경우 특히 post json 오브젝트보다 유용합니다.

//javascript file 
    var data = { UserID: "10", UserName: "Long", AppInstanceID: "100", ProcessGUID: "BF1CC2EB-D9BD-45FD-BF87-939DD8FF9071" };
    var request = JSON.stringify(data);
    request = encodeURIComponent(request);

    doAjaxGet("/ProductWebApi/api/Workflow/StartProcess?data=", request, function (result) {
        window.console.log(result);
    });

    //webapi file:
    [HttpGet]
    public ResponseResult StartProcess()
    {
        dynamic queryJson = ParseHttpGetJson(Request.RequestUri.Query);
            int appInstanceID = int.Parse(queryJson.AppInstanceID.Value);
        Guid processGUID = Guid.Parse(queryJson.ProcessGUID.Value);
        int userID = int.Parse(queryJson.UserID.Value);
        string userName = queryJson.UserName.Value;
    }

    //utility function:
    public static dynamic ParseHttpGetJson(string query)
    {
        if (!string.IsNullOrEmpty(query))
        {
            try
            {
                var json = query.Substring(7, query.Length - 7); //seperate ?data= characters
                json = System.Web.HttpUtility.UrlDecode(json);
                dynamic queryJson = JsonConvert.DeserializeObject<dynamic>(json);

                return queryJson;
            }
            catch (System.Exception e)
            {
                throw new ApplicationException("can't deserialize object as wrong string content!", e);
            }
        }
        else
        {
            return null;
        }
    }

.NET Core에서는HttpClient를 설정합니다.transfer-encoding: chunked디폴트로는 header 입니다.이로 인해가 발생할 수 있습니다.NET Web API 컨트롤러 매개 변수가 null입니다.

이 문제를 해결하려면 , 다음의 순서를 설정할 필요가 있습니다.ContentLength헤더를 명시적으로 지정합니다.

var json = JsonConvert.SerializeObject(myObject);
var content = new StringContent(json, Encoding.UTF8, "application/json");
content.Headers.ContentLength = json.Length;
var response = await client.PostAsync("http://my-api.com", content);

이미 알고 있다면 대답하세요.transfer-encoding헤더가 문제입니다.ASP에서 청크 전송 부호화를 디세블로 하는 방법.HttpClient를 사용한 Net C#

수정되지 않는 관련 버그: https://github.com/dotnet/runtime/issues/30283

언급URL : https://stackoverflow.com/questions/12916340/complex-type-is-getting-null-in-a-apicontroller-parameter

반응형