Zbudowałem API z Lumen i chcę uzyskać do niego dostęp za pomocą JavaScript i obiektu XMLHttpRequest. Ale za każdym razem moje żądania PUT, GET, POST i DELETE są przekształcane w OPCJE - Żądanie. Czytałem wiele stron internetowych z informacjami o CORS. Buduję middleware o następującej treści:Lumen: Włącz 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;
}
}
Mój kod klienta:
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);
}
Moja prośba-informacja o żądaniu 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
Moja odpowiedź informacyjna żądania 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
Moja prośba-informacje żądania 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
Moje informacje odpowiedź na żądanie 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
W Inspekcji wstępnej nie ma "Access-Control-ce - *" - Nagłówki. Nie wiem dlaczego; Włączyłem go za pomocą mojego lumen-cors-middleware.
Wygląda na to, że Twoja prośba uruchamia przeglądarkę, aby najpierw wysłać [preflight CORS] (https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests). Nie można tego obejść; to wymagane zachowanie w przeglądarkach w odniesieniu do żądań dotyczących różnych źródeł. Wygląda więc na to, że możesz potrzebować przeczytać dokumenty CORS i odpowiednio zaktualizować swój kod. – sideshowbarker
Na żądanie "PUT" AJAX i w wielu innych przypadkach przeglądarki generują preflightowane żądania, które próbujesz obsłużyć. Jaki jest twój dokładny problem? –
Brak żądania POST, PUT lub DELETE działa - brak odpowiedzi to mój problem :-) Żądania GET działają – Nis