2016-05-04 6 views
0

Eine Anfrage wird über Angularjs $ http mit JSON-Daten an meine REST-Service gesendet. Wenn die Antwort zurückgegeben wird, benötigt Header können folgend, setzt

Response.ok() 
.entity(emp) 
.headers.add("Access-Control-Allow-Origin", "*") 
.headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT") 
.allow("OPTIONS").build(); 

Aber wenn ich eine Post-Anforderung ohne Daten senden,

$http.post('localhost:8000/employer/register') 

es erfolgreich ist. Mit Daten schlägt es fehl.

$http({method: 'post', url:serverUrl, data:{name:'abc'}, headers:{'Content-Type':'application/json'} }); 

Dies ist meine Ruhe Service

@Path("/register") 
public class EmpService{ 

@Get 
@Path("test") 
@Produces 
public String test(){ 
return "works"; 
} 

@Post 
@Consumes(MediaType.APPLICATION_JSON) 
public Response addEmp(Emp emp){ 

return Response.ok() 
.entity(emp) 
.headers.add("Access-Control-Allow-Origin", "*") 
.headers.add("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT") 
.allow("OPTIONS").build(); 

Browser-Konsole ist, wie folgend.

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8081/employer/register (Reason: CORS header 'Access-Control-Allow-Origin' missing). 
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8081/employer/register (Reason: CORS request failed). 

UPDATE: Ich fand, dass der Service nicht aufgerufen, da keine Sys.out.println keine Protokolle gibt. Wer weiß, wo das Problem liegt?

+0

verwirrte Antwort wird zurückgegeben erfordern Kopfzeilen set ???? verwirrend, da die Anfrage mit oder ohne Header gesendet wird –

+0

@WasiqMuhammad. Ich habe die Frage mit den Kopfzeilenwerten aktualisiert. –

Antwort

1

Sie die Header innerhalb der Ressource Methode nicht hinzufügen . Warum? Das Preflight ist eine OPTIONS-Anfrage, bei der es sich um die "pre" -Anfrage handelt, um die Zugriffskontrollheader zu erhalten. Und Sie haben keine OPTIONS-Methode. Der Browser ruft die @POST-Methode nicht auf, um Zugriffssteuerungsheader zu erhalten. Aus diesem Grund sollten Sie using a filter instead sein und die Header dort setzen.

+0

Danke für Ihre Antwort und Anleitung. Die spitze Antwort löste mein Problem. Vielen Dank! !! –

0

Vielleicht sollten Sie einen Header senden, der vom Server nicht erlaubt ist.

Versuchen Sie folgendes:

headers.add("Access-Control-Allow-Headers", 
    "Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers, otherCustomHeader"); 
+0

Danke Fabio. Aber ich habe festgestellt, dass selbst mein Dienst nicht mit Daten aufgerufen wird. Ohne Daten ist es ein Erfolg. –

+0

Sie können die Signatur der Methode auf dem Server anzeigen? –

+0

Ich habe die Frage mit der Serviceklasse aktualisiert. Ich habe eine Test-Rest-Service-Methode hinzugefügt: GET. Wenn ich es anrufe, funktioniert es. Einziges Problem ist die POST-Methode mit Daten. Wenn keine Daten vorhanden sind, ist es erfolgreich. –

0

Try this.May Ihre api Route der Server nicht erlaubt Header Daten sein, die Probleme verursacht werden können

$http.post(url:serverUrl, data:{name:'abc'} }); 
+0

Danke Wasiq. es ist immer noch dasselbe. :( –

+0

zeigen Sie mir Ihre Konsole –

+0

Ich aktualisierte meine Frage (siehe unten der Frage) mit der Browser-Konsole. Auch ich fand, dass der Dienst auch nicht aufgerufen wird. –