Đặt tiêu đề HTTP cho một yêu cầu


159

Tôi có một yêu cầu cụ thể trong ứng dụng yêu cầu xác thực Cơ bản, vì vậy tôi cần đặt tiêu đề Ủy quyền cho yêu cầu đó. Tôi đọc về việc thiết lập các tiêu đề yêu cầu HTTP , nhưng từ những gì tôi có thể nói, nó sẽ đặt tiêu đề đó cho tất cả các yêu cầu của phương thức đó. Tôi có một cái gì đó như thế này trong mã của tôi:

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

Nhưng tôi không muốn mọi yêu cầu bài viết của mình gửi tiêu đề này. Có cách nào để gửi tiêu đề chỉ cho một yêu cầu tôi muốn không? Hoặc tôi phải loại bỏ nó sau khi yêu cầu của tôi?


Câu trả lời:


320

Có một tham số tiêu đề trong đối tượng cấu hình mà bạn chuyển đến $httpcho các tiêu đề cho mỗi cuộc gọi:

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

Hoặc với phương pháp phím tắt:

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

Danh sách các tham số hợp lệ có sẵn trong tài liệu dịch vụ $ http .


1
Tôi đoán tôi nên nhìn vào tài liệu gần hơn một chút ... Tôi chỉ đang cố gắng sử dụng các phương pháp phím tắt. Điều này làm việc tuyệt vời. Cảm ơn.
dnc253

17
@ dnc253 Điều này cũng hoạt động với các phương pháp phím tắt. Mã sẽ là$http.get('www.google.com/someapi', {headers: {'Authorization': 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=='}});
Yunchi

1
Có cách nào để mở rộng $ http (trong khi duy trì "khả năng tiêm" và không phải áp dụng nó vào bộ sưu tập tiêu đề mặc định) để tự động thêm tiêu đề này cho bạn không? Có vẻ như dư thừa để luôn phải thêm tiêu đề cho mỗi cuộc gọi an toàn bạn thực hiện.
nokturnal

31
Không làm việc cho tôi. Không có tiêu đề nào tôi thêm theo cách này được thêm vào yêu cầu thực tế.
mcv

4
Bất cứ khi nào tôi cố gắng đặt tiêu đề, yêu cầu của tôi được đưa ra dưới dạng OPTIONYêu cầu, do đó, điểm cuối của tôi trả về một 404 NOT FOUNDý nghĩa: Nó chỉ biết GET /someResourcekhôngOPTIONS /someResource
Matheus Felipe

19

Hãy thử điều này, có lẽ nó hoạt động;)

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

Và chắc chắn rằng back end của bạn cũng hoạt động, hãy thử điều này. Tôi đang sử dụng RESTI 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');
    }

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.