2012-05-08 38 views
18

Trước hết, tôi đã tìm kiếm câu trả lời cho vấn đề của mình trong một số chủ đề và tôi không thể tìm thấy giải pháp phù hợp với mã của mình.

Tôi đang cố gắng để có được câu trả lời từ một servlet, nếu tôi đi đến http://XXXZZZ/Servlet/Login?login=pepe&pass=1234 tôi nhận hợp lệ JSON như mong đợi:

{"id":3,"login":"pepe","key":"0D1DBA4BE87E02D43E082F9AA1ECFDEB"} 

Nhưng khi tôi cố gắng cùng với $ .ajax, tôi nhận được 2 lỗi .

lỗi
$.ajax({ 
    type : "Get", 
    url :"http://XXXZZZ/Servlet/Login", 
    data :"login="+login+"&password="+pass, 
    dataType :"jsonp", 
    success : function(data){ 
    alert(data);}, 
    error : function(httpReq,status,exception){ 
    alert(status+" "+exception); 
    } 
}); 

đầu tiên (trong cửa sổ popup):

parsererror Error: jQuery17104145435250829905_1336514329291 was not called 

lỗi thứ hai (trong giao diện điều khiển Chrome):

Uncaught SyntaxError: Unexpected token : Login 1 

(Và có JSON Tôi đang chờ đợi).

P.S. Tôi phải sử dụng dataType: "jsonp", bởi vì nếu tôi sử dụng "json" tôi cũng có vấn đề với Cross-Domain.

+0

Whats hàm lỗi cho? – adeneo

+1

Bạn không thể * force * JSONP. Nó phải được hỗ trợ và trả về bởi máy chủ. Nếu không, bạn sẽ không may mắn. Nếu bạn có quyền kiểm soát máy chủ, hãy làm cho nó hỗ trợ JSONP. –

+0

Tôi cũng đang lập trình máy chủ;) –

Trả lời

10
succes : function(data){ 

Đó là một typo:

success : function(data){ 
+8

+1 cho mắt đại bàng. – undefined

+0

Không, xin lỗi tôi đã viết nó sai ở đây, trong đoạn code của nó viết "thành công" –

1

Trước hết bạn có một lỗi đánh máy trong tham số thành công của bạn; bạn đã bỏ lỡ kết thúc s. Ngoài ra, khi bạn đang thực hiện một yêu cầu JSONP, bạn cần trả về thông tin JSON của bạn ở định dạng JSONP; sẽ bao gồm mã thông báo gọi lại như một phần của chuỗi trả về. Một chuỗi mẫu JSONP sẽ trông thích này:

yourcallbacktoken({"id":3,"login":"pepe","key":"0D1DBA4BE87E02D43E082F9AA1ECFDEB"}) 

Hãy nhìn vào trang này để biết thêm thông tin về thông số kỹ thuật JSONP: http://devlog.info/2010/03/10/cross-domain-ajax/

20

Nếu bạn đang sử dụng jsonp thì cú pháp là sai

Bạn cần phải trả lại

myJsonMethod({"id":3,"login":"pepe","key":"0D1DBA4BE87E02D43E082F9AA1ECFDEB"}); 

và cũng thêm vào tùy chọn theo yêu cầu ajax của bạn

jsonp: false, 
jsonpCallback: "myJsonMethod" 

nên

$.ajax({ 
    type : "Get", 
    url :"http://XXXZZZ/Servlet/Login", 
    data :"login="+login+"&password="+pass, 
    dataType :"jsonp", 
    jsonp: false, 
    jsonpCallback: "myJsonMethod", 
    success : function(data){ 
     alert(data);}, 
    error : function(httpReq,status,exception){ 
     alert(status+" "+exception); 
    } 
}); 

(và các khóa học sửa chữa success như @voyager lưu ý)

+0

Vì vậy, trong các máy chủ tôi phải thay đổi 'tĩnh JSONObject Đăng nhập (String đăng nhập, String password) ném JSONException {' để ' Đăng nhập chuỗi tĩnh (Đăng nhập chuỗi, Mật khẩu chuỗi) { ... json.put ("id", id); json.put ("đăng nhập", đăng nhập); json.put ("khóa", khóa); trả lại ("myJsonMethod (" + json + ");"); ' –

+0

@PabloPostigo, bạn có thể sử dụng lớp ['JSONPObject'] (http://jackson.codehaus.org/1.5.3/javadoc/org/codehaus /jackson/map/util/JSONPObject.html) –

+0

có vấn đề tương tự. thêm jsonp: false là thứ cố định cho tôi – Luke

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