Home > Web Front-end > JS Tutorial > body text

Detailed explanation of cross-domain data request examples using JSONP with JavaScript

高洛峰
Release: 2017-01-09 10:46:06
Original
1387 people have browsed it

Preface

Recently, due to work needs, I need to introduce iCiba’s daily sentence to the page. iCiba has opened its API to the outside world. The interface returns json data. In order to make the page lighter, I have no use. jQuery, but directly wrote a piece of code in pure js:

<script type="text/javascript">
 function httpGetAsync(theUrl, callback)
 {
 xmlHttp = null;
 if (window.XMLHttpRequest)
 {// code for IE7, Firefox, Opera, etc.
 xmlHttp = new XMLHttpRequest();
 }
 else if (window.ActiveXObject)
 {// code for IE6, IE5
 xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
 }
 if (xmlHttp != null)
 {
 xmlHttp.onreadystatechange = function() {
 if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
 {
  callback(xmlHttp.responseText);
 }
 else
 {
  console.error("Problem retrieving XML data");
 }
 }
 xmlHttp.open("GET", theUrl, true); // true for asynchronous
 xmlHttp.setRequestHeader(&#39;Access-Control-Allow-Origin&#39;, &#39;*&#39;);
 xmlHttp.send(null);
 }
 else
 {
 console.error("Your browser does not support XMLHTTP.");
 }
 }
 
 function showIcibaDS(ds_data)
 {
 // show daily sentence
 content = ds_data.content;
 note = ds_data.note;
 document.write(content + &#39;<br>&#39;);
 document.write(note);
 }
 
 httpGetAsync("http://open.iciba.com/dsapi/", showIcibaDS);
</script>
Copy after login

After running, the data was not obtained, but the following error message appeared:

XMLHttpRequest cannot load http://open.iciba.com/dsapi/. Response to preflight request doesn&#39;t pass access control check: No &#39;Access-Control-Allow-Origin&#39; header is present on the requested resource. Origin &#39;null&#39; is therefore not allowed access. The response had HTTP status code 501.
Copy after login

This is the problem of cross-domain requests. So what is a cross-domain request? For security reasons, browsers adopt the Same origin Policy, which only allows interaction with interfaces in the same domain.

Same domain refers to:

Same protocol: such as http or https

Same domain name: such as http://konghy.cn/a or http: //konghy.cn/b

Same port: If both are 80 port

In other words, the user opened the page: http://blog.konghy.cn, js under the current page Sending data requests to the interface http://blog.konghy.cn/XXX is allowed by the browser. But if you send a data request to: http://open.iciba.com/xxx, it will be blocked by the browser because there is a cross-domain call.

The solution to cross-domain requests is JSONP (JSON with Padding). The script tag in HTML can load js in other domains. JSONP uses the script tag to load data to obtain the data and execute it as JS code. Then use a callback function to extract the data:

<script type="text/javascript">
 var cur_date = new Date();
 document.getElementById("cur_year").innerHTML = cur_date.getFullYear();
 
 function showIcibaDS(ds_data)
 {
 // show daily sentence
 content = ds_data.content;
 note = ds_data.note;
 ds_p = document.getElementById("iciba_ds")
 var content_span = document.createElement(&#39;span&#39;);
 var note_span = document.createElement(&#39;span&#39;);
 var br = document.createElement(&#39;br&#39;)
 content_span.innerHTML = content
 note_span.innerHTML = note
 ds_p.appendChild(content_span);
 ds_p.appendChild(br);
 ds_p.appendChild(note_span);
 }
</script>
<script type="text/javascript" src="http://open.iciba.com/dsapi/?callback=showIcibaDS"></script>
Copy after login

Then check the information and find that someone has encapsulated it:

function jsonp(setting)
{
 setting.data = setting.data || {}
 setting.key = setting.key||&#39;callback&#39;
 setting.callback = setting.callback||function(){}
 setting.data[setting.key] = &#39;__onGetData__&#39;
 
 window.__onGetData__ = function(data) {
 setting.callback (data);
 }
 var script = document.createElement(&#39;script&#39;)
 var query = []
 for(var key in setting.data)
 {
 query.push(key + &#39;=&#39; + encodeURIComponent(setting.data[key]))
 }
 script.src = setting.url + &#39;?&#39; + query.join(&#39;&&#39;)
 document.head.appendChild(script)
 document.head.removeChild(script)
}
 
jsonp({
 url: &#39;http://photo.sina.cn/aj/index&#39;,
 key: &#39;jsoncallback&#39;,
 data: { page: 1, cate: &#39;recommend&#39; },
 callback: function(ret) {
 console.log(ret)
 }
})
Copy after login

If you are using jQuery, you can directly use ajax to request data:

<script src="js/jquery-1.11.3.js"></script>
<script>
$(function(){
 $.ajax({
 async: true,
 type: "GET",
 dataType: &#39;jsonp&#39;,
 jsonp: &#39;callback&#39;,
 jsonpCallback: &#39;callbackfunction&#39;,
 url: "http://open.iciba.com/dsapi/",
 data: "",
 timeout: 3000,
 contentType: "application/json;utf-8",
 success: function(data) {
 console.log(data);
 }
 });
})
</script>
Copy after login

Summary

Above That’s the entire content of this article. I hope the content of this article can be of some help to everyone’s study or work. If you have any questions, you can leave a message to communicate.

For more detailed examples of JavaScript using JSONP to request data across domains, please pay attention to the PHP Chinese website for related articles!


Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!