Estoy tratando de enviar una solicitud HTTP usando Vapor para verificar un recaptcha
La API Captcha de Google se define de la siguiente manera:
URL: https://www.google.com/recaptcha/api/siteverify MÉTODO: PUBLICACIÓN
Parámetro POST | Descripción |
---|---|
secreto | Requerido. La clave compartida entre su sitio y reCAPTCHA. |
respuesta | Requerido. El token de respuesta del usuario proporcionado por la integración del lado del cliente reCAPTCHA en su sitio. |
IP remota | Opcional. La dirección IP del usuario. |
Entonces necesito hacer una solicitud POST con 2 parámetros (secreto y respuesta).
En Swift tengo:
func routes(_ app: Application throws { app.on(.POST, "website_form") { req -> EventLoopFuture<View> in var form: FromRequest = /*initial values*/ /*decode form data*/ do { req.client.post("https://www.google.com/recaptcha/api/siteverify") { auth_req in try auth_req.content.encode(CaptchaRequestBody(secret: "6Lfoo98dAAAAALRlUoTH9LhZukUHRPzO__2L0k3y", response: form.recaptcha_response), as: .formData) auth_req.headers = ["Content-Type": "application/x-www-form-urlencoded"] }.whenSuccess { resp_val in print("Response: \(resp_val)") } } } /* More code */ } struct CaptchaRequestBody: Content { let secret: String let response: String }
Después de ejecutar la solicitud de publicación, aparece el siguiente código de error:
{ "success": false, "error-codes": [ "missing-input-secret" ] }
No puedo encontrar ninguna solución que funcione, incluso los documentos oficiales de Vapor no sirvieron, ¿alguien podría ayudarme?
Como dijo Nick: el problema era que en lugar de .formData
, necesitaba usar .urlEncodedForm
.
La API de Google requiere que las solicitudes sean formularios con codificación URL. Al usar la configuración .formData
, está aplicando MultiPart.
Cambie la configuración a .urlEncodedForm
, lo que garantiza que la solicitud cumpla con los requisitos de la API de Google.