VB POST pide valores de control de forma
Estoy teniendo diferentes problemas al tratar de hacer una solicitud de POST a mi API, la API funciona perfectamente probado en postman.
Me gustaría saber si alguien ve que estoy haciendo mal, muchas gracias
Dim url As String = "http://0.0.0.0/connect"
Dim dataToPassFromFormData As String = "client_id=1020&client_secret=FF29D58E&grant_type=password&username=admin&password=123"
Dim enc As UTF8Encoding
Dim postdatabytes As Byte()
Dim request As HttpWebRequest = TryCast(WebRequest.Create(url), HttpWebRequest)
enc = New System.Text.UTF8Encoding()
postdatabytes = enc.GetBytes(dataToPassFromFormData)
request.Method = "POST"
request.ContentLength = postdatabytes.Length
Using stream = request.GetRequestStream()
stream.Write(postdatabytes, 0, postdatabytes.Length)
End Using
Dim response As HttpWebResponse = TryCast(request.GetResponse(), HttpWebResponse)
Dim receiveStream As Stream = response.GetResponseStream()
Dim readStream As StreamReader = New StreamReader(receiveStream, Encoding.UTF8)
Dim us As user
us = JsonConvert.DeserializeObject(Of user)(readStream.ReadToEnd())
response.Close()
readStream.Close()
Return us.access_token
Mi api espera estos parámetros por cuerpo / formulario-data
client_id=1020
client_secret=FF29D58E
grant_type=password
username=admin
password=123
Pregunta hecha hace 3 años, 4 meses, 28 días - Por techtactician
2 Respuestas:
-
El código que has proporcionado parece estar correctamente estructurado para hacer una solicitud POST a tu API. Sin embargo, hay algunos aspectos que podrían estar causando problemas al intentar enviar los datos en formato de formulario.
Una posible corrección que puedes intentar es ajustar la forma en la que se envían los datos en el body de la solicitud. En lugar de enviar los datos como una cadena de texto, puedes intentar construir un objeto
NameValueCollection
y convertirlo en una cadena de formulario antes de enviarlo en la solicitud.Aquí te dejo un ejemplo de cómo podrías ajustar tu código para enviar los datos en formato de formulario:
vb Dim url As String = "http://0.0.0.0/connect" Dim formData As New NameValueCollection() formData.Add("client_id", "1020") formData.Add("client_secret", "FF29D58E") formData.Add("grant_type", "password") formData.Add("username", "admin") formData.Add("password", "123") Dim request As HttpWebRequest = TryCast(WebRequest.Create(url), HttpWebRequest) request.Method = "POST" request.ContentType = "application/x-www-form-urlencoded" Dim formDataString As String = String.Join("&", formData.AllKeys.Select(Function(key) $"{key}={HttpUtility.UrlEncode(formData(key))}")) Dim formDataBytes As Byte() = Encoding.UTF8.GetBytes(formDataString) request.ContentLength = formDataBytes.Length Using stream = request.GetRequestStream() stream.Write(formDataBytes, 0, formDataBytes.Length) End Using Dim response As HttpWebResponse = TryCast(request.GetResponse(), HttpWebResponse) Dim receiveStream As Stream = response.GetResponseStream() Dim readStream As New StreamReader(receiveStream, Encoding.UTF8) Dim us As user us = JsonConvert.DeserializeObject(Of user)(readStream.ReadToEnd()) response.Close() readStream.Close() Return us.access_token
En este ajuste, he utilizado
NameValueCollection
para almacenar los datos del formulario y luego los he convertido a una cadena de formulario antes de enviarlos en la solicitud. Además, he cambiado elContentType
de la solicitud aapplication/x-www-form-urlencoded
, que es el tipo de contenido comúnmente utilizado para enviar datos de formulario.Espero que este ajuste te ayude a resolver tus problemas al hacer la solicitud POST a tu API. ¡Déjame saber si necesitas más ayuda!
Respondida el Dec 18, 2020 a las 20:10 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El código que has proporcionado parece estar correcto y debería funcionar para enviar una solicitud POST a tu API con los parámetros del formulario-data esperados. Sin embargo, hay un pequeño error en la forma en que estás convirtiendo la respuesta JSON en un objeto
user
.En la línea:
vb us = JsonConvert.DeserializeObject(Of user)(readStream.ReadToEnd())
Estás intentando deserializar la respuesta JSON en un objeto
user
, pero no has definido la claseuser
. Necesitas definir una claseuser
con propiedades que coincidan con los nombres de las propiedades en la respuesta JSON para que la deserialización funcione correctamente.Por ejemplo, si tu respuesta JSON tiene el siguiente formato:
json { "access_token": "YOUR_ACCESS_TOKEN" }
Entonces necesitas definir una clase
user
como:vb Public Class user Public Property access_token As String End Class
Y luego puedes deserializar la respuesta JSON de la siguiente manera:
vb us = JsonConvert.DeserializeObject(Of user)(readStream.ReadToEnd())
Esto deserializará la respuesta JSON en un objeto
user
y asignará el valor de acceso de token a la propiedadaccess_token
del objetouser
.Además, asegúrate de que la API a la que estás enviando la solicitud POST está configurada para aceptar solicitudes de formulario-data y que la ruta de URL es correcta.
Si todavía tienes problemas después de realizar estos cambios, puedes proporcionar más información sobre el error que estás encontrando y el contenido de la respuesta de la API, y puedo ayudarte a depurar el problema.
Respondida el Dec 18, 2020 a las 20:19 - por Gemini
Votos positivos: 0 | Votos negativos: 0