none
Consumiendo servicio por GET ¿enviar datos en el Body? RRS feed

  • Pregunta

  • Buenas,

    Debo consumir un servicio web desde C# utilizando WebClient. El verbo definido es Get y tiene como 20 parámetros algunos obligatorios y otros opcionales. Mi duda es si debo enviar todos los parámetros concatenados en la Url:

    string urlServicio = $"{uriAPI}/Api/Filtrar/{param1}/{param2}/.../{param20}";

    He visto que en ocasiones, en lugar de hacer esto, construyen un objeto, lo serializan a JSON y lo mandan y en el otro extremo (el servicio) lo reciben como un objeto. Mi duda es: ¿Acaso al enviar un objeto este no se manda en el Body del Request? y según tengo entendido solo Post/Put ocupan el body, el resto debe enviar datos en el Header del Request.

    Por favor si me orientan, muchas gracias.


    • Editado eduar2083 miércoles, 29 de abril de 2020 12:16
    miércoles, 29 de abril de 2020 12:16

Respuestas

  • string urlServicio = $"{uriAPI}/Api/Filtrar/{param1}/{param2}/.../{param20}";

    Ten cuidado con esto. Aunque la especificación de HTTP no fija ningún límite concreto para la longitud de la url, en la práctica se producen limitaciones dependiendo de a dónde la estés mandando. Por ejemplo, Internet Explorer la limita a poco más de 2000 caracteres. Con 20 parámetros podrías fácilmente pasarte del límite, especialmente si contienen caracteres reservados, que tendrían que url-encodearse en hexadecimal para incorporarlos en la url. Para este número de parámetros yo recomendaría mejor usar un POST y pasarlos en el Body.

    miércoles, 6 de mayo de 2020 16:43
  • Hola. No tiene sentido llamar a un método async desde un Task.Run(). Eso se debería hacer cuando llames a métodos no asíncronos. También se debe usar Task.Run cuando el método que vas a llamar usa mucho ciclos de CPU únicamente. Si el método usa mucha salida o entrada de IO o es una mezcla de proceso de CPU y de IO, debes usar await

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    sábado, 9 de mayo de 2020 23:14
    Moderador

Todas las respuestas

  • hola

    porque WebClient? porque no usas HttpClient

    >>Mi duda es si debo enviar todos los parámetros concatenados en la Url

    depende, hay librerias que permiten armar la query sin tener que concatenar nada en un string

    >>en lugar de hacer esto, construyen un objeto, lo serializan a JSON y lo mandan y en el otro extremo

    cuando haces un POST se realiza de esa forma

    >>¿Acaso al enviar un objeto este no se manda en el Body del Request?

    si realizarias un POST si

    con un GET no

    HttpClient GetAsync, PostAsync, SendAsync in C#

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 29 de abril de 2020 16:35
  • Gracias Leandro por responder.

    Qué librería me podrías recomendar para armar los QueryString?

    Saludos.

    miércoles, 6 de mayo de 2020 15:34
  • hola

    No se si hay alguna libreria especifica porque depende del cliente que invoque la funcionalidad, si es codigo c# podrias usar la class Uri o sino

    UriBuilder

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 6 de mayo de 2020 15:55
  • string urlServicio = $"{uriAPI}/Api/Filtrar/{param1}/{param2}/.../{param20}";

    Ten cuidado con esto. Aunque la especificación de HTTP no fija ningún límite concreto para la longitud de la url, en la práctica se producen limitaciones dependiendo de a dónde la estés mandando. Por ejemplo, Internet Explorer la limita a poco más de 2000 caracteres. Con 20 parámetros podrías fácilmente pasarte del límite, especialmente si contienen caracteres reservados, que tendrían que url-encodearse en hexadecimal para incorporarlos en la url. Para este número de parámetros yo recomendaría mejor usar un POST y pasarlos en el Body.

    miércoles, 6 de mayo de 2020 16:43
  • Gracias Alberto,

    Sí había pensado en ello, lo tendré muy en cuenta para cuando la queryString se haga muy grande.

    Quiero aprovechar en que me dijeran cuál es la diferencia de hacer esto:

    var t = await Task.Run(() => httpClient.PostURIAsync(uri, c));

    con esto:

    var t = await httpClient.PostURIAsync(uri, c);

    Saludos.

    viernes, 8 de mayo de 2020 11:24
  • Hola. No tiene sentido llamar a un método async desde un Task.Run(). Eso se debería hacer cuando llames a métodos no asíncronos. También se debe usar Task.Run cuando el método que vas a llamar usa mucho ciclos de CPU únicamente. Si el método usa mucha salida o entrada de IO o es una mezcla de proceso de CPU y de IO, debes usar await

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    sábado, 9 de mayo de 2020 23:14
    Moderador