Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

516
Views
Angular $ http está enviando OPCIONES en lugar de PUT/POST

Estoy tratando de actualizar/insertar datos en una base de datos MySQL a través de un backend de PHP. Estoy construyendo el Front End con AngularJS y usando el servicio $http para comunicarme con la API REST.

Mi configuración se ve así:

Estoy configurando el encabezado a través de $httpProvider:

 $httpProvider.defaults.withCredentials = true; $httpProvider.defaults.headers = {'Content-Type': 'application/json;charset=utf-8'};

Y la llamada POST se ve así:

 return $http({ url: url, method: "POST", data: campaign });

La consola de desarrollo en Chrome me muestra esto:

ingrese la descripción de la imagen aquí

Cuando cambio de POST a PUT, envío una llamada OPTIONS en lugar de PUT. Y el tipo de contenido cambia solo a content-type .

Mi carga útil de solicitud se envía como un objeto:

ingrese la descripción de la imagen aquí

¿Cómo configuro mi encabezado correctamente?


EDITAR:

El backend de PHP establece algunos encabezados:

 $e->getResponse() ->getHeaders() ->addHeaderLine('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); $e->getResponse() ->getHeaders() ->addHeaderLine('Access-Control-Allow-Origin', '*');

¿Falta algo?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Vale, lo he solucionado.

¿Cual fue el problema?
El flujo de trabajo de CORS para DELETE, PUT y POST es el siguiente:

ingrese la descripción de la imagen aquí

Lo que hace es:

  1. Comprobando qué solicitud se va a realizar
  2. Si es POST, PUT o DELETE
  3. Envía primero una solicitud de OPCIÓN para comprobar si el dominio desde el que se envía la solicitud es el mismo que el del servidor.
  4. Si no , quiere que se permita un encabezado de acceso para enviar esta solicitud

Importante aquí: una solicitud de OPCIONES no envía credenciales .

Entonces mi servidor backend rechazó la solicitud PUT.

Solución:
Poniendo esto dentro del archivo .htaccess

 RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ blank.php [QSA,L] Header set Access-Control-Allow-Origin "http://sub.domain:3000" Header always set Access-Control-Allow-Credentials "true" Header always set Access-Control-Max-Age "1000" Header always set Access-Control-Allow-Headers "X-Requested-With, Content-Type, Origin, Authorization, Accept, Client-Security-Token, Accept-Encoding" Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"

Después de esto, cree un archivo .php vacío llamado blank.php dentro de la carpeta pública.

EDITAR: como señaló un comentarista, en lugar de crear un archivo PHP vacío, puede agregar esta regla de reescritura a su archivo .htaccess\;

 RewriteRule ^(.*)$ $1 [R=200,L,E=HTTP_ORIGIN:%{HTTP:ORIGIN}]]

Para aclarar:

  1. Ya envié el Access-Control-Header
  2. Lo que resolvió fueron las dos primeras líneas, y
  3. Access-Control-Allow-Origin desde el subdominio específico con Port

El mejor sitio web que pude encontrar para aprender más sobre CORS .

over 4 years ago · Santiago Trujillo Report

0

No necesita especificar sus encabezados $http manualmente, todo se hace por usted detrás de escena y se configuran automáticamente en application/json para solicitudes de tipo POST y PUT . Así que todo lo que debes hacer es

 $http.post(url, data); $http.put(url, data);
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!