Enviar formulario utilizando HttpClient en C #

c# html-agility-pack httpclient httpresponse

Pregunta

Estoy obteniendo el formulario del sitio web por htmlagilitypack, configurando la variable del formulario e intentando enviar el formulario. Parece que todo funciona bien, pero la respuesta del formulario enviado es nula.

static void Main(string[] args)
    {
        string urlAddress = "mywebsite";

        HtmlWeb web = new HtmlWeb();
        HtmlDocument doc = web.Load(urlAddress);

        // Post link
        var post = doc.GetElementbyId("post").GetAttributeValue("href", "");

        doc = web.Load(post);

        // get the form
        var form = doc.DocumentNode.SelectSingleNode("//form[@class='picker']");

        // get the form URI
        string actionValue = form.Attributes["action"]?.Value;
        System.Uri uri = new System.Uri(actionValue);

        // Populate the form variable
        var formVariables = new List<KeyValuePair<string, string>>();
        formVariables.Add(new KeyValuePair<string, string>("id", "ho"));
        var formContent = new FormUrlEncodedContent(formVariables);

        // submit the form
        HttpClient client = new HttpClient();
        var response = client.PostAsync(uri, formContent);

    }

¿Alguien sabe por qué mi respuesta variable es nula?

Gracias

Respuesta aceptada

HttpClient.PostAsync devuelve una Task<HttpResponseMessage> por lo que normalmente debería esperarse. Como lo está utilizando en el método principal, tendría que obtener el resultado de la tarea.

var response = client.PostAsync(uri, formContent).GetAwaiter().GetResult();

O el mas simple

var response = client.PostAsync(uri, formContent).Result;

En ambos casos, la respuesta sería una instancia de HttpResponseMessage . Puede inspeccionar esa instancia para el estado HTTP y el contenido de la respuesta.

Si usa .net core, incluso puede usar un método principal asíncrono como

static async Task Main(string[] args) {

    //..code removed for brevity

    var response = await client.PostAsync(uri, formContent);
    var content = await response.Content.ReadAsStringAsync();
    //...
}

Respuesta popular

Estás perdido . Result en tu PostAsync . Simplemente, cambie la línea a:

var response = client.PostAsync(uri, formContent).Result;

.Result sin embargo, ejecuta las tareas de forma síncrona. Devuelve AggregateException si hay una excepción que dificulta la depuración.

Sin embargo, si está utilizando Visual Studio 2017 Update 15.3 o superior y C # 7.1, ahora hay soporte para aysnc main .

Puede modificar su código de la siguiente manera:

static async Task Main()
{
    string urlAddress = "mywebsite";

        HtmlWeb web = new HtmlWeb();
        HtmlDocument doc = web.Load(urlAddress);

        // Post link
        var post = doc.GetElementbyId("post").GetAttributeValue("href", "");

        doc = web.Load(post);

        // get the form
        var form = doc.DocumentNode.SelectSingleNode("//form[@class='picker']");

        // get the form URI
        string actionValue = form.Attributes["action"]?.Value;
        System.Uri uri = new System.Uri(actionValue);

        // Populate the form variable
        var formVariables = new List<KeyValuePair<string, string>>();
        formVariables.Add(new KeyValuePair<string, string>("id", "ho"));
        var formContent = new FormUrlEncodedContent(formVariables);

        // submit the form
        HttpClient client = new HttpClient();
        var response = await client.PostAsync(uri, formContent);
}

Esto te ayudará a await la tarea async . En caso de que obtenga alguna excepción, recibirá la excepción real en lugar de AggregateException .

Es importante tener en cuenta que actualmente C # 7.1 actualmente no está habilitado de forma predeterminada. Para habilitar las características 7.1, necesitaría cambiar la configuración de la versión de idioma para su proyecto.

Consulte este enlace para más detalles.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué