2015-12-27 15 views
7

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.

+1

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

+1

In richieste PUT 'AJAX e in molti altri casi i browser generano richieste preflight che si è tentato di gestire. Qual è il tuo problema esatto? –

+0

Nessuna richiesta POST, PUT o DELETE funziona - nessuna risposta è il mio problema :-) GET Le richieste stanno funzionando – Nis

risposta

2

In Lumen, è necessario impostare manualmente i percorsi OPTIONS per ogni route POST, PUT, DELETE....

Questo è quello che ho fatto per risolvere il problema.

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

Il percorso sopra prenderà tutte le OPTIONS richieste di voi.

In 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

L'ho compilato come scritto .... ma posso inviare richieste GET ma il mio post, mettere, cancellare richieste fallite con 405 Metodo non permesso. Tutti i dati per l'header http-request puoi vedere qui: http://pastebin.com/2Eks9Xqz – Nis

+0

I'll got in modo che il mio – Nis

+0

Grazie amico .. Mi ha salvato seriamente .. Hanno provato tutti i middleware e tutta la biblioteca ma il tuo codice ha fatto il lavoro! – Rujul1993

3

Add seguenti intestazioni in file public/.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" 

questo sta funzionando bene per risolvere il problema di origine incrociata.

+0

Funziona bene e rapidamente .. dopo che posso creare un middleware – elporfirio