none
Se pierde el signo + en paso de parámetros por POST RRS feed

  • Pregunta

  • Hola!

    Entoy enviando unos valores por POST a una página web y me llega el signo + convertido en un espacio.

    Uso WebRequest para el envío.

    Alguna idea de como solventarlo?

    Gracias.

    martes, 21 de junio de 2016 10:13

Respuestas

  • Parece claro que algo no se codificaba correctamente pero no entiendo el motivo.

    Al final he cambiado algunas cosas y por fin llegan los datos correctamente codificados. Uso la clase WebClient y la generación de parámetros con otra clase y ellos se encargan de enviar los datos de manera correcta.

            Using wc As New WebClient()

                Dim reqparm = New System.Collections.Specialized.NameValueCollection()

                For Each Item In postData
                    reqparm.Add(Item.Key, Item.Value)
                Next

                Dim responsebytes = wc.UploadValues("http://localhost:24511/", "POST", reqparm)
                Dim responsebody = Encoding.UTF8.GetString(responsebytes)

                Return responsebody
            End Using

    miércoles, 22 de junio de 2016 15:30

Todas las respuestas

  • En realidad no parece que lo pierda porque aparece en la propiedad   _collection del bindingContext.ValueProvider

    pero al recuperarlo con valueprovider.GetValue("RutaFichero").AttemptedValue.ToString() ya me aparece el valor con el signo + cambiado a un espacio.

    ¿? Sugerencias.

    Un saludo.

    martes, 21 de junio de 2016 11:48
  • La sugerencia es que muestres el request.

    El ContentType tiene que ser "application/x-www-form-urlencoded"

    Esto hace que el signo + sea codificado como %2B, para que el parser del otro lado no entienda al signo + como un espacio.


    martes, 21 de junio de 2016 12:12
  • Lo envío de esta manera de un servidor a otro:

          Dim request As WebRequest = WebRequest.Create("http://localhost:24511/")

            request.Method = "POST"
            request.ContentType = "application/x-www-form-urlencoded"

            Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)

            request.ContentLength = byteArray.Length

            Dim dataStream As Stream = request.GetRequestStream()

            dataStream.Write(byteArray, 0, byteArray.Length)
            dataStream.Close()

            Dim response As WebResponse = request.GetResponse()

            Dim estado = CType(response, HttpWebResponse).StatusDescription

            dataStream = response.GetResponseStream()

            Dim reader As New StreamReader(dataStream)

            Dim responseFromServer As String = reader.ReadToEnd()

            reader.Close()
            dataStream.Close()
            response.Close()

    y lo recogo en un binding personalizado:

            public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
            {

               

    CLote lote = (CLote)base.BindModel(controllerContext, bindingContext);

                try
                {
                    IValueProvider valueprovider = bindingContext.ValueProvider;

                    var rutasArchivos = valueprovider.GetValue("Valor")?.AttemptedValue?.ToString()

                    ...
    martes, 21 de junio de 2016 12:53
  • ..
    martes, 21 de junio de 2016 13:21
  • La sugerencia es que muestres el request.

    El ContentType tiene que ser "application/x-www-form-urlencoded"

    Esto hace que el signo + sea codificado como %2B, para que el parser del otro lado no entienda al signo + como un espacio.



    No entiendo dónde está aquí la respuesta al problema.

    Los datos ya se envían codificados en UTF8 y con el ContentType "application/x-www-form-urlencoded" pero el problema persiste.

            request.Method = "POST"
            request.ContentType = "application/x-www-form-urlencoded"

            Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)

    Está claro que algo falta o en la aplicación que envía o en la que recoge. La cuestión es el qué.

    miércoles, 22 de junio de 2016 14:23
  • Parece claro que algo no se codificaba correctamente pero no entiendo el motivo.

    Al final he cambiado algunas cosas y por fin llegan los datos correctamente codificados. Uso la clase WebClient y la generación de parámetros con otra clase y ellos se encargan de enviar los datos de manera correcta.

            Using wc As New WebClient()

                Dim reqparm = New System.Collections.Specialized.NameValueCollection()

                For Each Item In postData
                    reqparm.Add(Item.Key, Item.Value)
                Next

                Dim responsebytes = wc.UploadValues("http://localhost:24511/", "POST", reqparm)
                Dim responsebody = Encoding.UTF8.GetString(responsebytes)

                Return responsebody
            End Using

    miércoles, 22 de junio de 2016 15:30