2014-07-22 10 views
7

Sto provando a fare una richiesta POST cross-origin usando Angular $ http con il seguente codice.

//I've tried setting and removing these http config options 
$http.defaults.useXDomain = true; 
delete $http.defaults.headers.common['X-Requested-With']; 
$http.defaults.headers.common['Content-Type'] = 'application/x-www-form-urlencoded'; 

//Basic request, with some private headers removed 
return $http({ 
    method: 'POST', 
    //withCredentials:true, 
    headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}, 
    params: params, 
    url: url 
}); 

La richiesta Opzioni Preflight ottiene un 200 OK, ma la successiva POST riceve una risposta 400 Bad Request. Osservando la traccia nella finestra di debug di Chrome, non vedo un'intestazione Content-Type: application/x-www-form-urlencoded; charset=UTF-8 per il POST. Presumo che questo è il motivo per cui il server sta restituendo una risposta Bad Request.

Sto impostando alcune altre intestazioni personalizzate che ho omesso dal codice sopra, e vengono inviate e visualizzate correttamente.

Devo anche menzionare che posso fare questa richiesta utilizzando l'app Advanced Rest Client per Chrome e ricevere la risposta corretta. (Un token di accesso)

Ho anche provato a fare un semplice XMLHttpRequest(), ma ottengo gli stessi errori.

Qualche idea sul perché l'intestazione Content-Type non viene impostata?

+0

Possibile duplicato di [Angolare, il tipo di contenuto non viene inviato con $ http] (http://stackoverflow.com/questions/16194442/angular-content-type-is-not-being-sent-with-http) –

risposta

11

Non sono sicuro che l'intestazione Content-Type verrà inviata se NON si inviano dati. Aggiungere un oggetto data e provarlo:

return $http({ 
    method: 'POST', 
    //withCredentials:true, 
    headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}, 
    data: data, 
    url: url 
}); 

Inoltre, di solito con un post si utilizza data invece di params (ottenere).

È inoltre possibile fare riferimento a questo SO domanda che ha un po 'di informazioni su come trasformare i dati se è necessario: How can I post data as form data instead of a request payload?

+1

Sì, grazie. Me ne rendo conto ora L'intestazione si presenta quando passo alcuni dati. Ancora ottenendo un '400 Bad Request', però. Quindi immagino che la domanda abbia una risposta, ma sto ancora ricevendo la stessa risposta. Non sono sicuro di cosa sta succedendo. – user3783608

+0

La tua domanda riguardava il tipo di contenuto.Se hai una domanda a parte sulla richiesta 400, creane una nuova con i bit di codice specifici (server e client). La mia ipotesi è che tu non stia inviando il token con la richiesta (nell'intestazione ???) – lucuma

+1

Sto inviando dati e non è ancora stato impostato. – AlxVallejo

1

Il mio problema era che stavo impostando la variabile data a un oggetto invece di una stringa .

return $http({ 
    method: 'POST', 
    //withCredentials:true, 
    headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'}, 
    data: {'key1':'value1', 'key2':'value2'}, 
    url: url 
}); 

Una volta modificato in data:'key1=value1&key2=value2' ha funzionato correttamente. C'era anche un backslash che dovevo inserire manualmente nel codice %5c.

+0

È anche possibile trasferirlo sulla richiesta. Vedere la risposta con 60 upvotes (quinto in basso) http://stackoverflow.com/questions/11442632/how-can-i-make-angular-js-post-data-as-form-data-instead-of-a -request-payload – lucuma

7

L'intestazione 'Content-Type' non viene aggiunta alla richiesta se la proprietà data non è definita, è possibile inviare una stringa vuota come dati "" ad esempio.

var req = { 
       method: 'GET', 
       url: '<your url here>', 
       //headers: { 
       // 'Content-Type': 'application/json;charset=utf-8' 
       //}, 
       data: "" 
      }; 
    $http(req); 
+0

funziona alla grande !!!, si tratta di un bug angolare o di cosa si tratta ?? Il parametro dati –

0

Than you very much "Liran B" il fix ha lavorato come un campione per me .... problema mi è stato bugging da alcune ore ....

var req = { 
       method: 'GET', 
       url: '<your url here>', 
       //headers: { 
       // 'Content-Type': 'application/json;charset=utf-8' 
       //}, 
       data: "" 
      }; 

    $http(req); 
1

mi trovo di fronte lo stesso problema , mentre si impostano le intestazioni. abbiamo bisogno di inviare i dati dei parametri nella richiesta $http come questo

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

siamo in grado di inviare i dati in bianco anche. funzionerà bene.

+0

è obbligatorio –

Problemi correlati