Necesito hacer una simple webapi llamada a método post con el argumento de cadena.

A continuación es el código que estoy tratando, pero cuando el punto de interrupción en la webapi método, el valor recibido es null.

StringContent stringContent = new System.Net.Http.StringContent("{ \"firstName\": \"John\" }", System.Text.Encoding.UTF8, "application/json");
HttpClient client = new HttpClient();
HttpResponseMessage response = await client.PostAsync(url.ToString(), stringContent);

y en el servidor de código:

 //POST api/values
[HttpPost]
public void Post([FromBody]string value)
{
}

ayuda por favor…

  • "firstName" != "value"
InformationsquelleAutor Harshini | 2016-01-01

2 Comentarios

  1. 18

    Si quieres enviar un json a su API de Web, la mejor opción es utilizar un modelo de unión de la característica, y el uso de una Clase, en lugar de una cadena.

    Crear un modelo

    public class MyModel
    {
        [JsonProperty("firstName")]
        public string FirstName { get; set; }
    }

    Si usted no utiliza el JsonProperty atributo, se puede escribir de la propiedad en minúsculas camello, como este

    public class MyModel
    {
        public string firstName { get; set; }
    }

    , A continuación, cambiar la acción, el cambio de tipo de parámetro a MyModel

    [HttpPost]
    public void Post([FromBody]MyModel value)
    {
        //value.FirstName
    }

    Puede crear clases de C# automáticamente utilizando Visual Studio, mira esta respuesta aquí Deserializar JSON en Objeto de C#

    Hice esta prueba siguiente código

    Web de la API y del Controlador de Vista del Modelo

    using System.Web.Http;
    using Newtonsoft.Json;
    
    namespace WebApplication3.Controllers
    {
        public class ValuesController : ApiController
        {
            [HttpPost]
            public string Post([FromBody]MyModel value)
            {
                return value.FirstName.ToUpper();
            }
        }
    
        public class MyModel
        {
            [JsonProperty("firstName")]
            public string FirstName { get; set; }
        }
    }

    De la consola de la aplicación cliente

    using System;
    using System.Net.Http;
    
    namespace Temp
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                Console.WriteLine("Enter to continue");
                Console.ReadLine();
                DoIt();
                Console.ReadLine();
            }
    
            private static async void DoIt()
            {
                using (var stringContent = new StringContent("{ \"firstName\": \"John\" }", System.Text.Encoding.UTF8, "application/json"))
                using (var client = new HttpClient())
                {
                    try
                    {
                        var response = await client.PostAsync("http://localhost:52042/api/values", stringContent);
                        var result = await response.Content.ReadAsStringAsync();
                        Console.WriteLine(result);
                    }
                    catch (Exception ex)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine(ex.Message);
                        Console.ResetColor();
                    }
                }
            }
        }
    }

    De salida

    Enter to continue
    
    "JOHN"

    httpclient llamada a webapi para publicar datos no funciona

    • He intentado esto.. he cambiado la webapi código para la solución anterior y del lado del cliente código sigue siendo el mismo..pero aún es nulo. ¿Tengo que cambiar algo en el cliente?
    • Acabo de añadir un ejemplo de código de prueba con el de salida, compruebe y vea lo que es diferente de su código real.
    • Muchas gracias por el código..problema era que yo había guardado de la clase del modelo de controlador … cuando me la sacó y se coloca fuera..funcionó bien:)
    • Muy muy útil. he pegado el mismo problema. muchas gracias señor. ayuda para mí.
  2. 0

    Alternativas de respuesta: Usted puede dejar su parámetro de entrada como de cadena

    [HttpPost]
    public void Post([FromBody]string value)
    {
    }

    y llame a con el C# httpClient de la siguiente manera:

    var kvpList = new List<KeyValuePair<string, string>>
    {
        new KeyValuePair<string, string>("", "yo! r u dtf?")
    };
    FormUrlEncodedContent rqstBody = new FormUrlEncodedContent(kvpList);
    
    
    string baseUrl = "http://localhost:60123"; //or "http://SERVERNAME/AppName"
    string C_URL_API = baseUrl + "/api/values";
    using (var httpClient = new HttpClient())
    {
        try
        {   
            HttpResponseMessage resp = await httpClient.PostAsync(C_URL_API, rqstBody); //rqstBody is HttpContent
            if (resp != null && resp.Content != null) {
                var result = await resp.Content.ReadAsStringAsync();
                //do whatevs with result
            } else
                //nothing returned.
        }
        catch (Exception ex)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.WriteLine(ex.Message);
            Console.ResetColor();
        }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here