2012-04-10 14 views
5

मैं अपने JSONP अनुरोध के साथ एक समस्या मिल गया है .. डेटा प्रदर्शित नहीं किया जाएगा, Firebug एक "अमान्य लेबल" त्रुटि दिखाता है .."अवैध लेबल"?

enter image description here

मेरा JavaScript:

$.ajax({ 
    url: link, 
    dataType: "jsonp", 
    beforeSend: function(xhr) { 
     var base64 = btoa(username + ":" + password); 
     xhr.setRequestHeader("Authorization", "Basic" + base64); 
     xhr.overrideMimeType("application/json"); 
    }, 
    jsonpCallback: "getResources" 
}) 

function getResources(data) { 
    alert(data); 
    alert(JSON.parse(data)); 
    $.each(data.groupStatus, function(i, item) { 
     $("body").append("<p>ID: " + item.id + "</p>"); 
    }); 
} 

मेरे JSON:

{ 
    "groupStatus": [ 
     { 
      "id": "Application Layer Configuration-ApplicationLayer", 
      "time": 1332755316976, 
      "level": 0, 
      "warningIds": [], 
      "errorIds": [] 
     }, 
     { 
      "id": "Application Layer-ApplicationLayer:nscalealinst2", 
      "time": 1333431531046, 
      "level": 0, 
      "warningIds": [], 
      "errorIds": [] 
     } 
    ] 
} 

मेरे HTML:

<html> 
<head> 
    <title>Monitor</title> 
    <link href="css/gadget.css" rel="stylesheet" type="text/css" /> 
    <script type="text/javascript" src="js/jquery-1.7.2.js"></script> 
</head> 
<body> 
    <div id="content"></div> 
    <script type="text/javascript" src="js/gadget.js"></script> 
</body> 

अनुरोध ठीक काम करता है, लेकिन वैसे भी डेटा प्रदर्शित नहीं है।

enter image description here

इम दिनों के लिए एक समाधान .. किसी को मेरी मदद कर सकते के लिए खोज? आपका अग्रिम में ही बहुत धन्यवाद!

समाधान (अद्यतन: 06.09.12)

मैं इस समस्या का समाधान कर दिया है।

jQuery.support.cors = true; 
+1

इसका कारण यह है JSON है * नहीं, लेकिन यह एक के रूप में इस्तेमाल किया जा करने की कोशिश कर रहा है: को समझने के लिए क्यों नंगे JSON ऑब्जेक्ट शाब्दिक कारणों त्रुटि पार्स, इन उदाहरणों पर विचार करें। पता लगाएं कि JSONP अपेक्षा के अनुसार क्यों काम नहीं कर रहा है। (बीटीडब्ल्यू, 'getRessources' गलत वर्तनी की तरह दिखता है।) –

+0

अनुरोध ठीक काम करता है ..मैंने प्रतिक्रिया के साथ एक छवि जोड़ा है .. – P4tR

+2

प्रतिक्रिया JSONP नहीं है, यह JSON है। JSONP प्रतिक्रियाओं को कॉलबैक ({"foo": "bar"} जैसे फ़ंक्शन कॉल के अंदर लपेटा जाना चाहिए) ' –

उत्तर

7

एक JSONP कॉल की प्रतिक्रिया: सर्वर (REST इंटरफ़ेस), जिस पर मार डाला गया था कोई कॉलबैक फ़ंक्शन को लागू किया .. JSONP का उपयोग किए बिना crossdomain अनुरोध स्थापित करने के लिए एक और तरीका है निम्नलिखित jQuery चर सेट करने के लिए है जेएसओएन को फ़ंक्शन कॉल में लपेटने की आवश्यकता है, जहां फ़ंक्शन का नाम आमतौर पर यूआरएल में दिया जाता है। jQuery स्वचालित रूप से URL कि अनुरोध किया जा रहा है "के लिए कॉलबैक" का एक क्वेरी स्ट्रिंग पैरामीटर कहते हैं, तो अपने सर्वर पर स्क्रिप्ट के लिए इसी तरह कुछ करना चाहिए: जवाबी कार्रवाई के लिए एक समारोह का नाम जोड़ने के लिए

// assuming that $JSON contains your JSON content 
print "{$_REQUEST['callback']}({$JSON});"; 

कारण यह है कि एक JSONP अनुरोध वास्तव में एक XML अनुरोध है जो एक नियमित अनुरोध के बजाय डीओएम में जोड़ा गया है जो XMLHttpRequest ऑब्जेक्ट द्वारा किया जाएगा। JSONP का उपयोग करने से ब्राउज़र को क्रॉस-डोमेन अनुरोध करने की अनुमति मिलती है जो अन्यथा क्रॉस-डोमेन नीति द्वारा अवरोधित की जाती है जो एक एक्सएचआर पर लागू होती है (डिफ़ॉल्ट रूप से)।

+0

उत्कृष्ट उत्तर। बस एक जोड़ा ऐसा लगता है कि एक वाक्यविन्यास गलत वर्तनी है - बंद ब्रेस गलत जगह पर है। प्रिंट होना चाहिए "{$ _REQUEST ['कॉलबैक'] ({$ JSON})};"; – heximal

+0

यहां स्ट्रिप्स में इंटरपोलिंग चर के लिए PHP द्वारा ब्रेसिज़ का उपयोग किया जा रहा है, इसलिए '{$ _REQUEST ['callback']} ({$ JSON});' को कुछ कॉलबैक ({"my": "JSON के रूप में मुद्रित किया जाएगा "}) 'परिणामी आउटपुट में, यह मानते हुए कि' $ _REQUEST [' कॉलबैक '] 'कुछ कॉलबैक' था और' $ JSON' 'सरणी (" मेरा "=>" JSON ")' – steveukx

+0

आह के बराबर था, मैं देखो, तुम सही हो। यह ब्रेसिज़ महत्वपूर्ण हैं जब आप स्ट्रिंग में सरणी की तरह केवल $ JSON (इस मामले में ब्रेसिज़ की आवश्यकता नहीं है) से अधिक जटिल एम्बेड करने की योजना बना रहे हैं। – heximal

1

AJAX स्क्रिप्ट तो आप dataType: "json" इस तरह उपयोग कर सकते हैं एक ही डोमेन पर होस्ट किया जाता है:

function getResources(data, textStatus, jqXHR) { 
    console.log(data); 
    // no need to do JSON.parse(data) 
    $.each(data.groupStatus, function(i, item) { 
     $("body").append("<p>ID: " + item.id + "</p>"); 
    }); 
} 
$.ajax({ 
    url: link, 
    dataType: "json", 
    beforeSend: function(xhr) { 
     var base64 = btoa(username + ":" + password); 
     xhr.setRequestHeader("Authorization", "Basic" + base64); 
     xhr.overrideMimeType("application/json"); 
    }, 
    success: getResources 
});​ 

AJAX स्क्रिप्ट अन्य डोमेन पर होस्ट कर रही है तो सर्वर JSONP डेटा वापस चाहिए - JSON डेटा एक समारोह कॉल के अंदर लिपटे:

callback(
    { 
     "groupStatus": [] 
    } 
);​ 

सर्वर रिटर्न नंगे JSON डेटा तो आप त्रुटियों को पार्स हो जाएगी क्योंकि एक JSONP अनुरोध मोटे तौर पर एक <script src="..."> टैग इंजेक्शन लगाने के समान है। * एक वैध जे एस कार्यक्रम

// WORKS 
{ 
    alert("foo"); 
} 

// PARSE ERROR -- quote from MDN: 
// You should not use an object literal at the beginning of a statement. 
// This will lead to an error or not behave as you expect, because the { 
// will be interpreted as the beginning of a block. 
{ 
    "foo": "bar" 
} 

// WORKS 
callback({ 
    "foo": "bar" 
})​ 
संबंधित मुद्दे