2015-12-27 23 views
7

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.

+1

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

+1

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? –

+0

Brak żądania POST, PUT lub DELETE działa - brak odpowiedzi to mój problem :-) Żądania GET działają – Nis

Odpowiedz

2

W Lumen należy ręcznie skonfigurować trasy OPTIONS dla każdej trasy POST, PUT, DELETE....

Oto, co zrobiłem, aby rozwiązać problem.

$app->options('{all:.*}', ['middleware' => 'cors.options', function() { 
    return response(''); 
}]); 

Powyższa trasa odbierze wszystkie żądane od Ciebie OPTIONS.

W cors.options middleware:

public function handle($request, Closure $next) 
{ 
    return $next($request) 
     ->header('Access-Control-Allow-Origin', $_SERVER['HTTP_ORIGIN']) 
     ->header('Access-Control-Allow-Methods', 'PUT, POST, DELETE') 
     ->header('Access-Control-Allow-Headers', 'Accept, Content-Type,X-CSRF-TOKEN') 
     ->header('Access-Control-Allow-Credentials', 'true'); 
} 
+0

Zbudowałem go jak napisano .... ale mogę wysyłać żądania GET, ale mój post, put, żądania usunięcia nie powiodło się z 405 Metoda nie jest dozwolone. Wszystkie dane dla nagłówka żądania http można zobaczyć tutaj: http://pastebin.com/2Eks9Xqz – Nis

+0

Dostałem to w sposób, który mój – Nis

+0

Dzięki człowieku .. Poważnie uratował mnie .. Próbowałem wszystkich middleware i cała biblioteka, ale twój kod wykonał pracę! – Rujul1993

3

Dodaj następujący nagłówki do publicznego pliku/.htaccess.

Header set Access-Control-Allow-Origin "*" 
Header set Access-Control-Allow-Methods "GET,POST,PUT,DELETE,OPTIONS" 
Header set Access-Control-Allow-Credentials "true" 

Działa to dobrze, aby rozwiązać problem Cross Origin.

+0

To działa dobrze i szybko .. po utworzeniu oprogramowania pośredniego – elporfirio