2011-12-08 27 views
5

Tôi đang xây dựng một ứng dụng Spotify mà kéo dữ liệu JSON từ một REST API, sử dụng URL nhưTại sao các yêu cầu JSON đối với API bên ngoài của tôi bị hủy trong Ứng dụng Spotify của tôi?

http://www.mydomain.com/api/command?option=value 

Trong ứng dụng Spotify tôi manifest tôi đã thiết lập các điều khoản cần thiết cho máy chủ API của tôi:

"RequiredPermissions": [ "http://*.mydomain.com" ] 

Tôi cũng đã định cấu hình Chia sẻ tài nguyên nguồn gốc chéo trong tiêu đề phản hồi của API của tôi. Dưới đây là một ví dụ thực tế:

Server: nginx/0.7.65 
Date: Thu, 08 Dec 2011 09:07:16 GMT 
Content-Type: application/json 
Connection: keep-alive 
X-Powered-By: Mojolicious (Perl) 
Set-Cookie: mojolicious=eyJwcmVmcyI6e30sImZpbHRlcnMiOnsicGllciI6eyJzb3VyY2VzIjpbMjBdfSwiZWxlYyI6eyJzb3VyY2VzIjpbMTMsMTddLCJ4dGFncyI6WyJzaG9lZ2F6ZSJdLCJ0YWdzIjpbImVsZWN0cm9uaWMiXX0sInB1bmtkdWIiOnsieHRhZ3MiOlsicmVnZ2FlIl0sInRhZ3MiOlsicHVuayIsImR1YiJdfX0sImV4cGlyZXMiOjEzMjMzMzg4MzZ9--c6d6214525b5d56785eebc99217394a1; Version=1; Path=/; expires=Thu, 08 Dec 2011 10:07:16 GMT 
Content-Length: 23381 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: GET 
Access-Control-Allow-Headers: * 

200 OK 

Trong Spotify, trong tab chrome mạng thanh tra, tôi thấy rằng yêu cầu đang bị hủy:

Name: command www.mydomain.net/api 
Method: GET 
Status Text: (canceled) 
Type: undefined 
Initiator: jquery-1.js:7180 (Script) 
Size Content: 13B (0B) 
Time Latency: 21ms (0.0 days) 

Chrome inspector snapshot

Nếu tôi chạy ứng dụng của tôi trong Chrome trên máy tính để bàn của tôi (bên ngoài Spotify) yêu cầu không bị hủy và tất cả đều tốt.

Tôi đang làm gì sai? Hoặc có thể đây là lỗi (tính năng?) Trong bản phát hành xem trước Spotify?

+1

Điều đầu tiên tôi sẽ cố gắng làm là phân tích yêu cầu thực tế được thực hiện bởi Spotify sử dụng một công cụ như Wireshark. Sau đó, bạn có thể xác minh rằng a) ứng dụng Spotify đang gửi tiêu đề Gốc hợp lệ (được yêu cầu cho CORS) và b) bạn có thể thấy bất kỳ tiêu đề yêu cầu tùy chỉnh nào được gửi bởi Spotify. Lưu ý rằng thông số CORS không cho phép '*' làm giá trị cho tiêu đề Access-Control-Allow-Headers. Tôi khuyên bạn nên lặp lại các tham số bạn nhận được trong Access-Control-Request-Headers. – monsur

+0

Tôi đã có cùng một vấn đề và như monsur đã nêu ở trên, Access-Control-Allow-Headers là vấn đề tôi gặp phải. Tôi đã thay đổi máy chủ của mình để đặt tiêu đề thành "*" và nó hoạt động. – slurmomatic

+0

monsur - Tôi sẽ dùng thử wireshark, nhưng Chrome hiển thị yêu cầu gửi đi và không có tiêu đề bất thường nào. slurmomatic - Tôi đã có các tiêu đề cho phép được đặt thành "*". Vấn đề của bạn với Spotify? – nick

Trả lời

9

Một vài điều có thể gây ra điều này, tôi sẽ đặt chúng theo thứ tự từ dễ nhất đến khó giải quyết nhất.

  1. Kiểm tra xem bạn có đúng RequiredPermissions trong manifest.json bạn
  2. Kiểm tra xem manifest.json của bạn có một strjcture json hợp lệ, bạn có thể làm điều này trên các trang web như http://jsonlint.com/
  3. Hãy chắc chắn rằng bạn không lưu trữ tệp bằng ký tự BOM (byte vô hình ở đầu tệp), điều này có thể khiến việc phân tích tệp kê khai thành không thành công
  4. Đảm bảo rằng máy chủ bạn đang truy vấn chấp nhận nguồn gốc của bạn. Tất cả các ứng dụng trong Spotify có nguồn gốc như sp://appname, hầu hết các máy chủ chỉ chấp nhận giao thức http và https theo mặc định, vì vậy bạn có thể đặt Acces-Control-Allow-Origin thành * để đảm bảo yêu cầu không bị hủy.

Cuối cùng, tôi muốn lưu ý rằng mặc dù yêu cầu đôi khi hiển thị trong thanh tra bị hủy, yêu cầu vẫn sẽ có phản hồi chính xác, vì vậy hãy nhớ kiểm tra kỹ.

Hy vọng điều này sẽ hữu ích!

Chỉnh sửa: đôi khi, vì một số lý do lạ, nó cũng giúp đặt url bạn đang yêu cầu trong RequiredPermissions mà không cần http:// hoặc https:// được thêm vào trước.

+1

Cảm ơn danh sách kiểm tra này - vấn đề hóa ra là một cấu trúc json không hợp lệ trong tệp kê khai của tôi. – nick

+0

Đối với tôi, đó là cả json không hợp lệ và không khởi động lại toàn bộ máy khách bị mờ. – Gustav

4

Bạn đã thử khởi động lại Spotify để tải lại các thay đổi về RequiredPermissions? Tôi đã từng có một vấn đề tương tự đã được giải quyết khi khởi động lại.

+0

+1 - Tôi đã có chính xác cùng một vấn đề như OP, tất cả mọi thứ trên danh sách của Chiel kiểm tra, khởi động lại Spotify đã làm các trick. –

0

Spotify sử dụng Chromium bên trong và do đó tuân thủ chính sách Same Origin. Để giải quyết vấn đề này, hãy sử dụng JSONP. Tôi khuyên bạn nên đặt chính sách gốc trên máy chủ web của bạn để chỉ cho phép Spotify.

+0

JSON P là một tùy chọn, nhưng Chrome cũng hỗ trợ CORS – nick

4

Một điều cần lưu ý:

Nếu bạn đang phát triển địa phương.Do NOT cố gắng phát hành các cuộc gọi ajax/getJSON của bạn tới "localhost" hoặc "127.0.0.1", sử dụng giao diện Eth/WiFI IP của bạn thay vì.

Công cụ web làm nổi bật hoặc chặn các số nhận dạng cục bộ này trong yêu cầu hoặc giao diện loopback bị bỏ qua hoặc cửa sổ đã can thiệp lại.

Điều này có thể hiển nhiên đối với một số người, nhưng phải mất một lúc để tìm hiểu.

+0

Tôi có thể chứng thực rằng đây vẫn là một vấn đề. Tôi bị ảnh hưởng bởi điều này tại "Music Apps Hack Weekend". Nên đã nhấn SO sớm hơn. :) – Abel

0

Nguyên nhân gây ra sự cố của tôi là nhân vật Bom.

Để khắc phục điều đó tôi đã sử dụng Notepad ++, Encode -> Mã hóa theo UTF-8 mà không BOM

Các vấn đề liên quan