Legen Sie den HTTP-Header für eine Anforderung fest

159

Ich habe eine bestimmte Anforderung in meiner App, für die eine Standardauthentifizierung erforderlich ist. Daher muss ich den Autorisierungsheader für diese Anforderung festlegen. Ich habe über das Festlegen von HTTP-Anforderungsheadern gelesen , aber soweit ich das beurteilen kann, wird dieser Header für alle Anforderungen dieser Methode festgelegt. Ich habe so etwas in meinem Code:

$http.defaults.headers.post.Authorization = "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==";

Ich möchte jedoch nicht, dass jede meiner Post-Anfragen diesen Header sendet. Gibt es eine Möglichkeit, den Header nur für die eine Anfrage zu senden, die ich möchte? Oder muss ich es nach meiner Anfrage entfernen?

dnc253
quelle

Antworten:

320

Das Konfigurationsobjekt, an das Sie $httpfür Header pro Aufruf übergeben , enthält einen Header-Parameter :

$http({method: 'GET', url: 'www.google.com/someapi', headers: {
    'Authorization': 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='}
});

Oder mit der Shortcut-Methode:

$http.get('www.google.com/someapi', {
    headers: {'Authorization': 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='}
});

Die Liste der gültigen Parameter finden Sie in der $ http- Servicedokumentation.

Yunchi
quelle
1
Ich denke, ich hätte mir das Dokument etwas genauer ansehen sollen ... Ich habe nur versucht, die Verknüpfungsmethoden zu verwenden. Das funktioniert super. Vielen Dank.
dnc253
17
@ dnc253 Dies funktioniert auch mit Verknüpfungsmethoden. Der Code wäre$http.get('www.google.com/someapi', {headers: {'Authorization': 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='}});
Yunchi
1
Gibt es eine Möglichkeit, $ http zu erweitern (während "Injizierbarkeit" beibehalten wird und nicht auf die Standard-Header-Sammlung angewendet werden muss), um diesen Header automatisch für Sie hinzuzufügen? Scheint überflüssig zu sein, immer den Header für jeden sicheren Anruf hinzufügen zu müssen.
Nokturnal
31
Funktioniert bei mir nicht Keiner der auf diese Weise hinzugefügten Header wird der eigentlichen Anforderung hinzugefügt.
McV
4
Immer wenn ich versuche, die Header zu setzen, wird meine Anfrage als OPTIONAnfrage ausgegeben, folglich gibt mein Endpunkt eine zurück 404 NOT FOUND, was Sinn macht: Er kennt nur eine GET /someResourcenichtOPTIONS /someResource
Matheus Felipe
19

Versuchen Sie dies, vielleicht funktioniert es;)

.factory('authInterceptor', function($location, $q, $window) {


return {
    request: function(config) {
      config.headers = config.headers || {};

      config.headers.Authorization = 'xxxx-xxxx';

      return config;
    }
  };
})

.config(function($httpProvider) {
  $httpProvider.interceptors.push('authInterceptor');
})

Und stellen Sie sicher, dass auch Ihr Backend funktioniert. Versuchen Sie dies. Ich verwende RESTful CodeIgniter.

class App extends REST_Controller {
    var $authorization = null;

    public function __construct()
    {
        parent::__construct();
        header('Access-Control-Allow-Origin: *');
        header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method, Authorization");
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
        if ( "OPTIONS" === $_SERVER['REQUEST_METHOD'] ) {
            die();
        }

        if(!$this->input->get_request_header('Authorization')){
            $this->response(null, 400);    
        }

        $this->authorization = $this->input->get_request_header('Authorization');
    }

}
donny
quelle