Setel tajuk HTTP untuk satu permintaan

159

Saya memiliki satu permintaan khusus di aplikasi saya yang memerlukan otentikasi Dasar, jadi saya perlu mengatur header Otorisasi untuk permintaan itu. Saya membaca tentang pengaturan header permintaan HTTP , tetapi dari apa yang saya tahu, itu akan mengatur header itu untuk semua permintaan metode itu. Saya memiliki sesuatu seperti ini dalam kode saya:

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

Tapi saya tidak ingin semua permintaan posting saya mengirim tajuk ini. Apakah ada cara untuk mengirim tajuk hanya untuk satu permintaan yang saya inginkan? Atau apakah saya harus menghapusnya setelah permintaan saya?

dnc253
sumber

Jawaban:

320

Ada parameter tajuk di objek config yang Anda lewati $httpuntuk tajuk per panggilan:

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

Atau dengan metode pintas:

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

Daftar parameter yang valid tersedia di dokumentasi layanan $ http .

Yunchi
sumber
1
Saya kira saya harus melihat dokumen sedikit lebih dekat ... Saya hanya mencoba menggunakan metode pintas. Ini sangat bagus. Terima kasih.
dnc253
17
@ dnc253 Ini juga berfungsi dengan metode pintas. Kode tersebut akan menjadi$http.get('www.google.com/someapi', {headers: {'Authorization': 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='}});
Yunchi
1
Apakah ada cara untuk memperpanjang $ http (sambil mempertahankan "kemampuan injeksi" dan tidak harus menerapkannya ke koleksi tajuk default) untuk secara otomatis menambahkan tajuk ini untuk Anda? Sepertinya berlebihan untuk selalu harus menambahkan header untuk setiap panggilan aman yang Anda buat.
nokturnal
31
Tidak bekerja untuk saya. Tak satu pun dari header yang saya tambahkan dengan cara ini ditambahkan ke permintaan yang sebenarnya.
mcv
4
Setiap kali saya mencoba mengatur header, permintaan saya keluar sebagai OPTIONPermintaan, akibatnya titik akhir saya mengembalikan 404 NOT FOUNDyang masuk akal: Itu hanya tahu GET /someResourcetidakOPTIONS /someResource
Matheus Felipe
19

Coba ini, mungkin berhasil;)

.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');
})

Dan pastikan ujung belakang Anda juga berfungsi, coba ini. Saya menggunakan CodeIgniter yang tenang.

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
sumber