zoukankan      html  css  js  c++  java
  • 在nodejs服务器和ABAP服务器上使用jsonp

    In my blog Cross domain request in ABAP and Java with two workaround I introduce the step how to deal with Cross Domain issue using Cross-origin resource sharing ( CORS ) supported by almost all modern browsers.

    And there is another alternative for cross domain issue, that is JSONP which can work on legacy browsers which predate CORS support.

    In this blog, I will first explain how to use JSONP and then introduce the secret behind it.

    JSONP in nodeJS server

    Suppose I have two employee ID lookup service hosted by the port 3000 and 3001 in my local server. The service will simply return employee name by ID.

    The client web page is hosted in port 3000. According to same origin policy, the web page hosted in port 3000 is allowed to access the service hosted in localhost:3000, but forbidden for localhost:3001.

    Let’s now do a verification.
    This is my server listening to port 3000:

    const express = require('express');  
    const app = express();  
    const port = 3000;
    
    var path = require('path');
    var repo = {
    	"I042416": "Jerry",
    	"I042417": "Tom",
    	"I042418": "Jim"
    }
    app.use(express.static(path.join(__dirname, 'public')));
    
    app.get('/request', (request, response) => {  
     console.log("The employee ID sent from Client:" + request.query.id);
      response.json({
        UserName: repo[request.query.id] + " ( handled in port 3000 )"
      });
    });
    app.listen(port, (err) => {  
      if (err) {
        return console.log('something bad happened', err)
      }
      console.log(`server is listening on ${port}`)
    });
    

    And this is my client page which allows end user to type the employee ID and send the query request:

    <html>
    <body>
    <form action="">
      ID: <input type="text" id = "inumber" name="ID" value="I042416"><br>
      <input type="submit" value="Submit">
    </form> 
    </body>
    <script src="jquery1.7.1.js"></script>
    <script>
    $(document).ready(function(){	
         $("form").click(function(e){
         	e.preventDefault();
            var data = {
                id: $("#inumber").val()
            };
            $.ajax({
                type: 'GET',
                data: data,
                url: 'http://localhost:3000/request',
                dataType: 'json',
                success: function(data) {
                    alert(data.UserName);
                },
                error: function(jqXHR, textStatus, errorThrown) {
                    console.log('error ' + textStatus + ' ' + errorThrown);
                }
            }); 
        });
    });
    </script>
    </html>
    

    When I click Submit button, I get query response returned from service in port 3000 as expected:


    And this is the log output in the console of service in port 3000:

    Now I make small modification on the web page in port 3000, forcing it to send request to port 3001 instead:

    And resend the id query, this time I saw the expected cross domain error message:

    How to resolve cross domain issue using JSONP

    Both minor changes in client and server side are necessary.

    In service working in port 3001, I add a new service end point “request_jsonp”:

    app.get('/request_jsonp', (request, response) => {  
      console.log("This service supports JSONP now: " + request.query.id);
      var data = "{" + "UserName:'" + repo[request.query.id] + " ( handled in port 3001 )'"
      + "}";
      var callback = request.query.callback;
      var jsonp = callback + '(' + data + ');';
      response.send(jsonp);
      response.end();
    });
    

    In client web page, I change the send AJAX data type from json to jsonp, and inform server that “please parse the callback function name from literal “callback” in request header.

    $.ajax({
                type: 'GET',
                data: data,
                url: 'http://localhost:3001/request_jsonp',
                dataType: 'jsonp',
                jsonp: 'callback',
                jsonpCallback: 'jsonpCallback',
                success: function(data) {
                    alert(data.UserName);
                },
                error: function(jqXHR, textStatus, errorThrown) {
                    console.log('error ' + textStatus + ' ' + errorThrown);
                }
            }); 
    

    Now send the query again from localhost:3000 page, and the request could successfully reach service in localhost:3001, handled there and return to localhost:3000 again:

    Magic behind JSONP

    In fact, no magic at all. The mechanism of JSONP just utilize the “benefit” that the HTML

  • 相关阅读:
    解决:npm中 下载速度慢 和(无法将“nrm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确, 然后再试一次)。
    maven(一) maven到底是个啥玩意~
    Luogu3959 NOIP2017宝藏(状压dp)
    Luogu3953 NOIP2017逛公园(最短路+拓扑排序+动态规划)
    Luogu3952 NOIP2017时间复杂度
    BZOJ4753 JSOI2016最佳团体(分数规划+树形dp)
    BZOJ1975 SDOI2010魔法猪学院(启发式搜索+最短路+堆)
    BZOJ4105 THUSC2015平方运算(线段树)
    BZOJ5109 CodePlus 2017大吉大利,晚上吃鸡!(最短路+拓扑排序+bitset)
    Luogu3731 HAOI2017新型城市化(二分图匹配+强连通分量)
  • 原文地址:https://www.cnblogs.com/sap-jerry/p/13586153.html
Copyright © 2011-2022 走看看