2016-04-02 16 views
5

Tôi phải thực hiện cuộc gọi dịch vụ web từ trang web của tôi đến miền/máy chủ của bên thứ ba. Trong khi tôi thực hiện cuộc gọi này bằng cách sử dụng jQuery Ajax bằng phương thức Post với kiểu nội dung: text/plain và nó hoạt động tốt.Cuộc gọi qua hoạt động với Bài đăng nhưng không thực hiện được trước chuyến bay

Nhưng trong khi tôi đang thay đổi nó để content-type: text/xml nó được ném:

đáp ứng yêu cầu preflight không vượt qua kiểm tra kiểm soát truy cập: Không 'Access-Control-Allow-Origin 'tiêu đề có trên tài nguyên được yêu cầu .

Ngay cả khi được đặt trên máy chủ của bên thứ ba để cho phép truy cập vào trang web của chúng tôi. Và chúng ta đang nhận được tiêu đề này trong khi thực hiện cuộc gọi với kiểu nội dung: text/plain.

Chúng tôi cũng đã thêm sau đây trên máy chủ Thirdparty.

Access-Control-Allow-Methods : Get , Post , Options ,PUT 

Access-Control-Allow-Headers: Authorization,origin, content-type, accept 

Vui lòng cho tôi biết lý do yêu cầu trước chuyến bay không nhận được phản hồi 'Access-Control-Allow-Origin'?

+0

Tôi đã thay đổi dịch vụ Xà phòng thành Dịch vụ còn lại và bây giờ các cuộc gọi Tùy chọn có tất cả các tiêu đề bắt buộc kiểm soát truy cập *. Tôi không biết có gì sai với Soap Call. – yashpal

Trả lời

0

Lý do tập lệnh của bạn hoạt động cho văn bản/đồng bằng là vì đó là một yêu cầu đơn giản. Nếu bạn xem this answer, bạn có thể thấy rằng yêu cầu văn bản/đơn giản của bạn phù hợp với yêu cầu cho một yêu cầu đơn giản. Tuy nhiên, khi bạn thay đổi kiểu nội dung thành text/xml nó sẽ thay đổi nó thành một yêu cầu "không đơn giản".

Để yêu cầu "không đơn giản" của bạn hoạt động, bạn sẽ cần xem xét cách thực hiện yêu cầu trước chuyến bay. This website giải thích cách bạn có thể thực hiện việc đó trong "Xử lý yêu cầu không đơn giản".

Cập nhật

Chỉ cần một Lưu ý: Các Access-Control-Allow-Methods được đúc nhạy cảm (tất cả chữ hoa), và bạn không cần phải liệt kê bất kỳ phương pháp sử dụng cho một yêu cầu đơn giản (GET, HEAD, POST). - source

Access-Control-Allow-Methods: OPTIONS, PUT 
Access-Control-Allow-Headers: Authorization, Origin, Content-Type, Accept 

Firefox không bao gồm tiêu đề Xuất xứ trên yêu cầu cùng xuất xứ. Tuy nhiên, Chrome và Safari bao gồm tiêu đề Gốc về các yêu cầu POST/PUT/DELETE có nguồn gốc giống nhau (yêu cầu GET cùng nguồn gốc sẽ không có tiêu đề Gốc).

Có khả năng nguồn gốc giống nhau không?

Có thể có sự cố với số caching của bạn?

Hãy chắc chắn rằng bạn có những settings cho cuộc gọi ajax jquery của bạn:

crossDomain: true // Will force a cross domain request 
cache: false 
+0

Có, tôi biết đó là yêu cầu đơn giản và một yêu cầu khác là "yêu cầu không đơn giản". Câu hỏi đặt ra là trong một yêu cầu tôi nhận được tất cả các tiêu đề access-control- * nhưng trong Option tôi không nhận được các tiêu đề này. do đó, "yêu cầu không đơn giản" của tôi không thành công. – yashpal

+0

@yashpal Tôi đã cập nhật câu trả lời của mình. – GreeKatrina

0

Sự khác biệt giữa content-type:text/plaincontent-type: text/xml là: "text/xml" đòi hỏi "preflight" nhưng "text/plain" thì không.

Từ MDN:

Đặc biệt, một yêu cầu được preflighted nếu:

Nó sử dụng các phương pháp khác hơn GET, HEAD hay POST. Ngoài ra, nếu POST được sử dụng để gửi dữ liệu yêu cầu với Loại nội dung khác với ứng dụng/x-www-form-urlencoded, nhiều phần/biểu mẫu dữ liệu hoặc văn bản/đồng bằng, ví dụ: nếu yêu cầu POST gửi một tải trọng XML đến máy chủ bằng cách sử dụng ứng dụng/xml hoặc văn bản/xml, thì yêu cầu được xem trước.

Một số lý do tiềm năng những có thể gây ra thất bại của một yêu cầu preflight:

  1. CORS không được kích hoạt bởi máy chủ. Tìm kiếm cách bật CORS cho công nghệ máy chủ của bạn.
  2. Máy chủ không sử dụng yêu cầu khác ngoài "văn bản/đồng bằng". Ví dụ; Mùa xuân có một số consume option xác định loại nội dung nào được chấp nhận.
  3. Có tiêu đề "Ủy quyền" trong bài đăng của bạn. Nếu bạn đang gửi yêu cầu có bằng chứng xác thực, bạn cũng nên thêm tiêu đề Access-Control-Allow-Credentials: true. Một lần nữa từ MDN.
Các vấn đề liên quan