He escrito el código de abajo para enviar los encabezados, los parámetros post. El problema es que estoy usando SendAsync desde mi solicitud puede ser GET o POST. ¿Cómo puedo agregar Cuerpo del POST a este pedazo de código para que si hay algún post del cuerpo de datos que se añade en la solicitud de que puedo hacer y si su simple GET o POST sin cuerpo que enviar la solicitud de esa manera. Por favor, actualice el código de abajo:

HttpClient client = new HttpClient();

//Add a new Request Message
HttpRequestMessage requestMessage = new HttpRequestMessage(RequestHTTPMethod, ToString());

//Add our custom headers
if (RequestHeader != null)
{
    foreach (var item in RequestHeader)
    {

        requestMessage.Headers.Add(item.Key, item.Value);

    }
}

//Add request body


//Send the request to the server
HttpResponseMessage response = await client.SendAsync(requestMessage);

//Get the response
responseString = await response.Content.ReadAsStringAsync();
  • Por favor ver respuesta actualizada, tiene un mejor enfoque.
InformationsquelleAutor Balraj Singh | 2014-08-06

2 Comentarios

  1. 87

    Esto depende de qué contenido tiene. Necesario para inicializar el requestMessage.Content de la propiedad con una nueva HttpContent. Por ejemplo:

    ...
    //Add request body
    if (isPostRequest)
    {
        requestMessage.Content = new ByteArrayContent(content);
    }
    ...

    donde content es su contenido codificado. Usted también debe incluir correcta encabezado de tipo de Contenido.

    ACTUALIZACIÓN:

    Oh, puede ser incluso más bonito (a partir de este respuesta):

    requestMessage.Content = new StringContent("{\"name\":\"John Doe\",\"age\":33}", Encoding.UTF8, "application/json");
    • Cómo escribir un Json usando un jsonSerializer en el contenido?
    • Yo uso el Newtonsoft.Json paquete de hacerlo así: requestMessage.Content = new StringContent(JsonConvert.SerializeObject(body), Encoding.UTF8, "application/json"); también podría utilizar usted JsonSerializer a serializar en una cadena como la que hoy pueda estar haciendo, y luego pasar esa cadena como primer parámetro a la StringContent constructor.
  2. 5

    He implementado de la siguiente manera. Yo quería un genérico MakeRequest método que podría llamar a mi API y recibir contenido para el cuerpo de la solicitud – y también deserialise la respuesta en el tipo deseado. Puedo crear un Dictionary<string, string> objeto a la casa de los contenidos presentados, y, a continuación, establezca el HttpRequestMessage Content propiedad con ella:

    Método genérico para llamar a la API:

        private static T MakeRequest<T>(string httpMethod, string route, Dictionary<string, string> postParams = null)
        {
            using (var client = new HttpClient())
            {
                HttpRequestMessage requestMessage = new HttpRequestMessage(new HttpMethod(httpMethod), $"{_apiBaseUri}/{route}");
    
                if (postParams != null)
                    requestMessage.Content = new FormUrlEncodedContent(postParams);   //This is where your content gets added to the request body
    
    
                HttpResponseMessage response = client.SendAsync(requestMessage).Result;
    
                string apiResponse = response.Content.ReadAsStringAsync().Result;
                try
                {
                    //Attempt to deserialise the reponse to the desired type, otherwise throw an expetion with the response from the api.
                    if (apiResponse != "")
                        return JsonConvert.DeserializeObject<T>(apiResponse);
                    else
                        throw new Exception();
                }
                catch (Exception ex)
                {
                    throw new Exception($"An error ocurred while calling the API. It responded with the following message: {response.StatusCode} {response.ReasonPhrase}");
                }
            }
        }

    Llamar al método:

        public static CardInformation ValidateCard(string cardNumber, string country = "CAN")
        { 
            //Here you create your parameters to be added to the request content
            var postParams = new Dictionary<string, string> { { "cardNumber", cardNumber }, { "country", country } };
            //make a POST request to the "cards" endpoint and pass in the parameters
            return MakeRequest<CardInformation>("POST", "cards", postParams);
        }
    • Par de problemas con esta aplicación. En primer lugar, no es asíncrona. El uso de «.Resultado» hace que esto sea una llamada de bloqueo. El segundo problema es que no escala! Ver mi respuesta sobre el por qué de aquí – stackoverflow.com/questions/22560971/… Tercer problema es que se trate de las excepciones a la manija de control de flujo. Esta no es una buena práctica. Ver – docs.microsoft.com/en-us/visualstudio/profiling/…
    • Gracias por el aporte. Voy a ver los enlaces

Dejar respuesta

Please enter your comment!
Please enter your name here