Ho creato un'API con Lumen e desidero accedervi con JavaScript e l'oggetto XMLHttpRequest. Ma ogni volta che le mie richieste PUT, GET, POST e DELETE vengono trasformate in OPZIONI - Richiesta. Ho letto molti siti Web con informazioni su CORS. Costruisco middleware con il seguente contenuto:Lumen: abilita CORS
class CORSMiddleware
{
public function handle($request, \Closure $next)
{
$response = null;
/* Preflight handle */
if ($request->isMethod('OPTIONS')) {
$response = new Response();
} else {
$response = $next($request);
}
$response->header('Access-Control-Allow-Methods', 'OPTIONS, HEAD, GET, POST, PUT, DELETE');
$response->header('Access-Control-Allow-Headers', $request->header('Access-Control-Request-Headers'));
$response->header('Access-Control-Allow-Origin', '*');
return $response;
}
}
Il mio codice cliente:
var url = "http://localhost:8000/api/user";
var xmlHttpRequest = new XMLHttpRequest();
xmlHttpRequest.open('PUT', url, false);
xmlHttpRequest.send('{"username": "ABC", "password": "ABC","email": "[email protected]" }');
if (xmlHttpRequest.status == 200) {
console.log(xmlHttpRequest.responseText);
}
La mia richiesta-informazioni di richiesta GET:
Host: localhost:8000
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Origin: null
Connection: keep-alive
Cache-Control: max-age=0
mia risposta-dati di una richiesta GET:
Access-Control-Allow-Methods: OPTIONS, HEAD, GET, POST, PUT, DELETE
Access-Control-Allow-Origin: *
Cache-Control: no-cache
Connection: close
Content-Type: text/html; charset=UTF-8
Date: Sun, 27 Dec 2015 10:36:51 GMT
Host: localhost:8000
x-powered-by: PHP/7.0.0
La mia richiesta-dati di una richiesta PUT:
Host: localhost:8000
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Access-Control-Request-Method: PUT
Origin: null
Connection: keep-alive
Cache-Control: max-age=0
mio informazioni di risposta di una richiesta PUT:
Cache-Control: no-cache
Connection: close
Content-Type: text/html; charset=UTF-8
Date: Sun, 27 Dec 2015 10:36:51 GMT
Host: localhost:8000
x-powered-by: PHP/7.0.0
Nella verifica preliminare non ci sono "Access-Control-accettano - *" - intestazioni. Non so perché; L'ho abilitato con il mio middleware lumen-cors.
Sembra che la richiesta stia attivando il browser per inviare prima [una verifica preliminare CORS] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests). Non c'è modo di aggirare questo problema; è richiesto un comportamento nei browser per quanto riguarda le richieste di origine incrociata. Sembra quindi che potresti dover leggere i documenti CORS e aggiornare di conseguenza il tuo codice. – sideshowbarker
In richieste PUT 'AJAX e in molti altri casi i browser generano richieste preflight che si è tentato di gestire. Qual è il tuo problema esatto? –
Nessuna richiesta POST, PUT o DELETE funziona - nessuna risposta è il mio problema :-) GET Le richieste stanno funzionando – Nis