2013-01-19 31 views
5

Tôi đang cố tìm nạp nguồn cấp dữ liệu JSON tùy chỉnh mà tôi đã viết bằng jQuery bằng phương pháp getJSON. Vì một lý do không xác định, dường như URL bị xóa cache_gen.php?location=PL4 từ cuối và được thay thế bằng [object% 20Object] dẫn đến lỗi 404 xảy ra.Yêu cầu JSON được nối với [đối tượng% 20Object] trong jQuery

Đây là jQuery Tôi đang sử dụng:

var fetchData = function() { 

    if (Modernizr.localstorage) { 

     var api_location = "http://weatherapp.dev/cache_gen.php"; 
     var user_location = "PL4"; 
     var date = new Date(); 

     console.log(api_location + '?location=' + user_location); 

     jQuery.getJSON({ 
      type: "GET", 
      url: api_location + '?location=' + user_location, 
      dataType: "json", 
      success: function(jsonData) { 
       console.log(jsonData); 
      } 
     }); 

    } else { 
     alert('Your browser is not yet supported. Please upgrade to either Google Chrome or Safari.'); 
    } 
} 

fetchData(); 

Từ giao diện điều khiển log Tôi có thể thấy chuỗi URL được tính một cách chính xác như: http://weatherapp.dev/cache_gen.php?location=PL4

Tuy nhiên dòng thứ hai trong giao diện điều khiển là: Failed to load resource: the server responded with a status of 404 (Not Found).

Có ai có thể chỉ cho tôi đúng hướng với điều này không?

CẬP NHẬT 19/01/2013 23:15

Vâng, tôi vừa chuyển cho nên đó là phù hợp với các tài liệu một cách hoàn hảo bằng $.ajax. Tôi cũng đã thêm một sự kiện không thành công và đã ghi lại tất cả dữ liệu được truyền cho nó.

var fetchData = function() { 

    if (Modernizr.localstorage) { 

     var api_location = "http://weatherapp.dev/cache_gen.php"; 
     var user_location = "PL4"; 
     var date = new Date(); 

     var url = api_location + '?location=' + user_location; 

     console.log(url); 

     jQuery.ajax({ 
      type: "GET", 
      url: api_location + '?location=' + user_location, 
      dataType: "json", 
      success: function(jsonData) { 

       console.log(jsonData); 
      }, 
      error: function(jqXHR, textStatus, errorThrown) { 
       console.log('textStatus: ' + textStatus); 
       console.log('errorThrown: ' + errorThrown); 
       console.log('jqXHR' + jqXHR); 
      } 
     }); 

    } else { 
     alert('Your browser is not yet supported. Please upgrade to either Google Chrome or Safari.'); 
    } 
} 

fetchData(); 

Sau khi giao diện điều khiển của tôi này mang lại cho tôi những thông tin sau:

http://weatherapp.dev/cache_gen.php?location=PL4 
download_api.js:44textStatus: parsererror 
download_api.js:45errorThrown: SyntaxError: JSON Parse error: Unable to parse JSON string 
download_api.js:46jqXHR[object Object] 

tôi đã đảm bảo các tiêu đề cho thức ăn JSON là hiện nay, và các thức ăn chắc chắn được phục vụ JSON hợp lệ (nó có hiệu quả lưu trữ một 3rd nguồn cấp dữ liệu dịch vụ bên để tiết kiệm chi phí trên API).

+0

http://weatherapp.dev/cache_gen.php?location=PL4 không phải là url hoạt động.<----- nhấp vào nó – Popnoodles

+0

@popnoodles, nó có thể là chuyển hướng '/ etc/hosts' :). Tuy nhiên, chắc chắn âm thanh '.dev' fishy – Alexander

+0

.dev là một miền phát triển. Nó đã thiết lập này có một máy chủ ảo Apache trên hệ thống cục bộ của tôi, có một mục trong '' '/ etc/hosts''' của tôi để đảm bảo rằng nó được giải quyết đúng cách. Tôi có thể truy cập miền này trong trình duyệt của mình, miền giống với tên tệp JS đang được tải từ đó. –

Trả lời

5

Lý do tại sao bạn thấy lỗi này:

http://weatherapp.dev/cache_gen.php?location=PL4 
download_api.js:44textStatus: parsererror 
download_api.js:45errorThrown: SyntaxError: JSON Parse error: Unable to parse JSON string 
download_api.js:46jqXHR[object Object] 

Là bởi vì JSON của bạn không hợp lệ. Ngay cả khi một phản hồi quay trở lại từ máy chủ một cách chính xác, nếu dataType của bạn là 'json' và phản hồi trả về không được định dạng đúng JSON, jQuery sẽ thực thi tham số hàm lỗi.

http://jsonlint.com là cách thực sự nhanh chóng và dễ dàng để xác minh tính hợp lệ của chuỗi JSON của bạn.

+0

Cảm ơn một lần nữa Adam. –

+0

Mở rộng câu trả lời hay của @ Adam. Nói chung, cái gì đó không khớp giữa giá trị 'datatype' của bạn trên cuộc gọi (rõ ràng hoặc ngụ ý) và dữ liệu thực tế được trả về từ máy chủ. Tôi đã chỉ định "html" làm kiểu dữ liệu của tôi và nhận được lỗi này. Tôi bỏ qua tham số datatype tùy chọn và ngừng nhìn thấy lỗi. Tôi chắc chắn sẽ trả lại html và chèn vào trang nhưng tôi sẵn sàng cúi đầu xuống nữ thần ajax và để cô ấy nghĩ rằng giá trị trả lại của tôi là bất kỳ loại nào cô ấy muốn miễn là cuộc gọi của tôi hoạt động. –

0

Kiểm tra việc sử dụng chức năng thực tế:

http://api.jquery.com/jQuery.getJSON/

Bạn không thể vượt qua trên tham số đối tượng vào $.getJSON như với $.ajax, mã của bạn sẽ trông như thế này:

jQuery.getJSON('api_location + '?location=' + user_location) 
     .done(function() { 
      //success here 
     }) 
     .fail(function() { 
      //fail here 
     }); 

Để có thể làm cho nó rõ ràng hơn một chút, $.getJSON chỉ là một "hàm bao bọc" mà cuối cùng gọi $.ajax với {type:'get',dataType:'JSON'}. Bạn có thể thấy điều này trong liên kết tôi đã cung cấp ở trên.

+0

Thực ra chỉ cần OP dễ dàng thay thế .getJSON với .ajax – Popnoodles

+0

@popnoodles tại sao? OP không sử dụng bất kỳ tùy chọn nào '$ .getJSON' chưa bao gồm – charlietfl

+1

@charlietfl vì họ đã viết mã của họ như thể họ nên sử dụng .ajax - thay đổi chỉ 7 ký tự dễ dàng hơn. – Popnoodles

0

Tôi đã chạy vào cùng một vấn đề ngay hôm nay. Trong trường hợp của tôi, tôi đã gán một đối tượng JSON cho một biến có tên là 'location' là một từ dành riêng trong JavaScript under Windows và appearantly là một cách viết tắt cho windows.location! Vì vậy, trình duyệt được chuyển hướng đến URL hiện tại với [object% 20Object] được thêm vào nó. Sử dụng đơn giản một tên biến khác với 'vị trí' nếu điều tương tự xảy ra với bạn. Hy vọng điều này sẽ giúp một ai đó.

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