programing

WebAPI에서 POST 데이터를 가져오는 방법은 무엇입니까?

lastmoon 2023. 6. 11. 11:13
반응형

WebAPI에서 POST 데이터를 가져오는 방법은 무엇입니까?

다음 양식으로 서버에 요청을 보냅니다.

http://localhost:12345/api/controller/par1/par2

요청은 다음과 같은 방법으로 올바르게 해결됩니다.

[HttpPost]
public void object Post(string par1, string par2)

하지만 요청 내용을 통해 추가 데이터를 전달합니다.이 데이터를 어떻게 검색할 수 있습니까?

예를 들어, 요청이 다음과 같은 형식으로 전송된다고 가정합니다.

<form action="http://localhost:12345/api/controller/par1/par2" method="post">
    <input type="hidden" name="data" value="value" />
    <input type="submit" name="submit" value="Submit" />
</form>

이 질문의 답변에서:asp.net webapi로 Json Post Values를 얻는 방법

  1. 파라미터 바인딩을 사용하여 자동 구문 분석.dynamic로 구성됨JToken그러므로.Value접속자

    public void Post([FromBody]dynamic value) {
        var x = value.var1.Value; // JToken
    }
    
  2. 다음과 같이 읽으십시오.Request.RequestUri.ParseQueryString()[key]

    public async Task Post() {        
       dynamic obj = await Request.Content.ReadAsAsync<JObject>();
       var y = obj.var1;
    }
    
  3. #2와 동일하며, 단지 비동기(?)가 아닌 도우미 방식으로 사용할 수 있습니다.

    private T GetPostParam<T>(string key) {
        var p = Request.Content.ReadAsAsync<JObject>();
        return (T)Convert.ChangeType(p.Result[key], typeof(T)); // example conversion, could be null...
    }
    

주의 - 미디어 유형을 예상합니다.application/json유발하기 위해JsonMediaTypeFormatter처리.

웹 양식 데이터를 처리하는 기존 방식과 WebAPI로 처리하는 방식 사이의 (중요하지만 강력한) 패러다임 전환에 대해 오늘 많은 시간을 할애한 후, 저는 이 토론에 2센트를 추가하려고 생각했습니다.

POST의 웹 양식 처리에 매우 일반적인 제가 하고 싶었던 것은 어떤 순서로든 원하는 양식 값을 가져올 수 있는 것입니다.데이터가 있으면 할 수 있다고 말합니다.System.Collections.Specialized.NameValueCollection하지만 WebAPI에서는 POST의 데이터가 스트림으로 반환됩니다.그래서 당신은 그것을 직접 할 수 없습니다.

하지만 이름이 붙은 멋진 작은 학급이 있습니다.FormDataCollection(시스템에서).넷. http.포맷)을 사용하면 컬렉션을 한 번 반복할 수 있습니다.

그래서 저는 간단한 유틸리티 방법을 작성했습니다.FormDataCollection한 번 그리고 모든 값을 a에 꽂습니다.NameValueCollection이 작업이 완료되면 모든 데이터를 원하는 대로 이동할 수 있습니다.

ApiController 파생 클래스에는 다음과 같은 게시 방법이 있습니다.

    public void Post(FormDataCollection formData)
    {
        NameValueCollection valueMap = WebAPIUtils.Convert(formData);

        ... my code that uses the data in the NameValueCollection
    }

정적 WebAP의 변환 방법아직 수업은 다음과 같습니다.

    /// <summary>
    /// Copy the values contained in the given FormDataCollection into 
    /// a NameValueCollection instance.
    /// </summary>
    /// <param name="formDataCollection">The FormDataCollection instance. (required, but can be empty)</param>
    /// <returns>The NameValueCollection. Never returned null, but may be empty.</returns>
    public static NameValueCollection Convert(FormDataCollection formDataCollection)
    {
        Validate.IsNotNull("formDataCollection", formDataCollection);

        IEnumerator<KeyValuePair<string, string>> pairs = formDataCollection.GetEnumerator();

        NameValueCollection collection = new NameValueCollection();

        while (pairs.MoveNext())
        {
            KeyValuePair<string, string> pair = pairs.Current;

            collection.Add(pair.Key, pair.Value);
        }

        return collection;
     }

이것이 도움이 되길 바랍니다!

여러 매개 변수가 포함된 요청을 보내는 데 문제가 있었습니다.

이전 매개 변수를 속성으로 하는 클래스를 보내 해결했습니다.

<form action="http://localhost:12345/api/controller/method" method="post">
    <input type="hidden" name="name1" value="value1" />
    <input type="hidden" name="name2" value="value2" />
    <input type="submit" name="submit" value="Submit" />
</form>

모델 클래스:

public class Model {
    public string Name1 { get; set; }
    public string Name2 { get; set; }
}

컨트롤러:

public void method(Model m) {
    string name = m.Name1;
}

작업에 대한 여러 매개 변수를 직접 처리하기는 어렵습니다.더 나은 방법은 뷰 모델 클래스를 만드는 것입니다.그러면 단일 매개 변수가 있지만 매개 변수에 여러 데이터 속성이 포함됩니다.

public class MyParameters
{
    public string a { get; set; } 
    public string b { get; set; }
}

public MyController : ApiController
{
    public HttpResponseMessage Get([FromUri] MyParameters parameters) { ... }
}

그런 다음 다음으로 이동합니다.

http://localhost:12345/api/MyController?a=par1&b=par2

참조: http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

"/par1/par2"를 사용하려는 경우 ASP 라우팅 규칙을 등록할 수 있습니다.egrouteTemplate: "API/{controller}/{action}/{a}/{b}".

http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api 을 참조하십시오.

이거 먹어봐요.

public string Post(FormDataCollection form) {
    string par1 = form.Get("par1");

    // ...
}

webapi 2에서 작동합니다.

여기에 있는 어떤 대답도 저에게는 통하지 않았습니다.게시 방법에서 FormDataCollection을 사용하는 것이 정답인 것 같지만, 제 게시 요청에 대한 무언가가 webapi를 질식하게 만들었습니다.결국 메소드 호출에 매개 변수를 포함하지 않고 이렇게 수동으로 양식 매개 변수를 파싱하여 작동했습니다.

public HttpResponseMessage FileUpload() {
    System.Web.HttpRequest httpRequest = System.Web.HttpContext.Current.Request;
    System.Collections.Specialized.NameValueCollection formData = httpRequest.Form;
    int ID = Convert.ToInt32(formData["ID"]);
    etc

저는 제 사용 사례에서 이것이 훨씬 더 유용하다는 것을 발견했습니다. 이 답변에 시간을 할애한 다른 사람이 이 답변을 적용하는 데 도움이 되기를 바랍니다.

public IDictionary<string, object> GetBodyPropsList()
        {
            var contentType = Request.Content.Headers.ContentType.MediaType;
            var requestParams = Request.Content.ReadAsStringAsync().Result;

            if (contentType == "application/json")
            {
                return Newtonsoft.Json.JsonConvert.DeserializeObject<IDictionary<string, object>>(requestParams);
            }
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }

웹 API 컨트롤러에서 양식 게시 데이터를 처리하는 방법이 있습니까?

ASP.NET Web API의 일반적인 접근 방식은 폼을 모델로 표현하여 미디어 유형 포맷터가 폼을 역직렬화하도록 하는 것입니다.또는 작업의 매개 변수를 NameValueCollection으로 정의합니다.

public void Post(NameValueCollection formData)
{
  var value = formData["key"];
}
    ON WEB API.


    [HttpGet]
    [Route("api/Get_EXCUTA_PROCEDURE_IBESVNDACMVDD")]
    public IHttpActionResult Get(int CodigoPuxada...)
    {
        string retornoErro = string.Empty;
        try
        {
            //int codigoPuxada = entrada.CodigoPuxada;

            SetKeyAtual(CodigoPuxada);

            var repo = new ItemBroker_Dim_Canal_BookRepositorio(ConnectionString);

            try
            {
                var dadosRetorno = repo.ExcuteProcedure_Busca_vbc_(CodigoPuxada,...); //  method return object  (dataset)
                return Ok(dadosRetorno);
            }
            catch
            {
                throw;
            }
        }
        catch (Exception ex)
        {
            retornoErro = ex.Message;
            if (ex.InnerException != null)
                retornoErro = ex.InnerException.ToString();
        }

        return Ok(retornoErro); 
    }


    Other projet invoke web api...
    (USING RESTSHARP DLL)

    RestClient clientHttpPost1 = null;
    string dadosVbc123 = string.empty;
                
    clientHttpPost1 = new RestSharp.RestClient($"{urlWebApiAvante}Get_EXCUTA_PROCEDURE_IBESVNDACMVDD?CodigoPuxada=...");

    RestSharp.RestRequest request2 = new RestSharp.RestRequest(RestSharp.Method.GET);
    request2.RequestFormat = RestSharp.DataFormat.Json;
    request2.AddHeader("Content-Type", "application/json;charset=utf-8");
    string strAux1 = string.Empty;
    request2.Timeout = 180000;
    RestSharp.IRestResponse response = clientHttpPost1.Execute(request2);
    if ((response != null) && response.StatusCode == System.Net.HttpStatusCode.OK)
    {
        try
        {
            var dataObjects = response.Content.ToString().Trim();
            dadosVbc123 = dataObjects.ToString().Replace("\t", "");
            if (dadosVbc123.Trim() == "{\"IBESVNDACMVDD\":[]}")
            dadosVbc123 = string.Empty;
        }
        ...
    }

    //  converting  JSON to dataset
    string val1 = dadosVbc123.Replace("{\"IBESVNDACMVDD\":", "").Replace("}]}", "}]");
    DataTable dtVBC123 = (DataTable)Newtonsoft.Json.JsonConvert.DeserializeObject(val1, (typeof(DataTable)));

언급URL : https://stackoverflow.com/questions/17832784/how-to-get-post-data-in-webapi

반응형