home_site

Lab07 - Technologia AJAX, obiekt XHR i funkcja fetch() [ ver. TI.2025.11.11.004 ]

Zawartość strony

Plan zajęć

Środowisko testowe dla aplikacji AJAX

W ramach zajęć zostaną opracowane skrypty w języku JavaScript, odpowiednie skrypty w języku HTML5 oraz skrypty działające po stronie serwera w języku Python. Skrypty po stronie serwera zostaną uruchomione w technologii CGI. Każde realizowane zadanie będzie wymagało trzech plików: pliku z kodem HTML5, pliku z kodem JavaScript i skryptu po stronie serwera w języku Python.`

Na rys.1 przedstwiono zasadę działania rozwiązań wykorzystujących obiekty XHR (technologia AJAX).

Lab7_xhr
Rys.1 Technologia AJAX

Pierwszy skrypt AJAX

Na początek opracujemy prostą aplikację, która wyświetli tekst "Hello AJAX" z serwera.

Do realizacji zadania potrzebujemy nastęujących plików:

Na początek przedstawiony zostanie skrypt CGI "ajax_hello.py" tworzący odpowiedź dla naszej aplikacji. Kod można przetestować uruchamiając w oknie systemu Linux.

#!/usr/bin/python3
print ("Content-Type: text/plain")
print ()
print ("""\
Hello, AJAX
""") 
  1. Kolejny skrypt zawiera kod html - ajax1.html.

    Plik ajax1.html - ( [listing dokumentu] [link do dokumentu]

       <!DOCTYPE html>
    <html>
       <head>
          <title>Ajax: Przyklad 1</title>
          <script src="ajax1c.js" type="text/javascript" ></script>
       </head>
       <body>
         <div style="text-align:center" >
           <table border="1" >
             <tr><th>Ajax: Pierwszy skrypt</th></tr>
           </table>
           <br />
           <form action="#">
              <input type="button" value="Pokaz informacje" onclick="sendRequest()"/>
           </form>
         </div>
        </body>
    </html>
      
  2. Skrypt JavaScript zawierający funkcjonalność XHR w wersji 1.

    Plik ajax1a.js - ( [listing dokumentu] [link do dokumentu]

    var request;
    function getRequestObject()      {
           if ( window.ActiveXObject)  {
                return ( new ActiveXObject("Microsoft.XMLHTTP")) ;
            } else if (window.XMLHttpRequest)  {
               return (new XMLHttpRequest())  ;
            } else {
               return (null) ;
            }
      }
    function sendRequest()      {
           request = getRequestObject() ;
           request.onreadystatechange = handleResponse ;
           request.open("GET", "../../cgi-bin/TI_2025/lab07/ajax_hello.py", true);
           request.send(null);
      }
    function handleResponse()      {
           if (request.readyState == 4)    {
               alert(request.responseText) ;
           }
    }
      
  3. Skrypt JavaScript zawierający funkcjonalność XHR w wersji 2.

    Plik ajax1b.js - ( [listing dokumentu] [link do dokumentu]

    function sendRequest() {
      const xhr = new XMLHttpRequest();
    
      xhr.addEventListener("load", e => {
        if (xhr.status === 200) {
            console.log("Wynik połączenia:");
            console.log(xhr.response);
    	alert(xhr.response) ;    
        }
      });
    
      xhr.addEventListener("error", e => {
        alert("Nie udało się nawiązać połączenia");
      });
    
      xhr.open("GET", "../../cgi-bin/TI_2025/lab07/ajax_hello.py", true);
      xhr.send();
    }
      
  4. Skrypt JavaScript zawierający funkcjonalność XHR w wersji 2 + Promise().

    Plik ajax1d.js - ( [listing dokumentu] [link do dokumentu]

    let request = obj => {
      return new Promise( (resolve, reject) => {	
        let xhr = new XMLHttpRequest();
    	
    	xhr.open(obj.method || "GET", obj.url);
    	//xhr.open("GET", "../../cgi-bin/TI_2025/lab07/ajax_hello.py", true);
    
        xhr.onload = () => {
          if (xhr.status === 200) {
            console.log("Wynik połączenia:");
            console.log(xhr.response);
    	    resolve (xhr.response) ;    
          } else {
    		reject (xhr.statusText);
    	  }		
        };
    
        xhr.onerror = () => reject (xhr.statusText);
        
        xhr.send();
      });	
    } ;
    
    function sendRequest() {
      request( {url: "../../cgi-bin/TI_2025/lab07/ajax_hello.py" } )
        .then ( data => { alert ( data ) ; })
        .catch ( error => { console.log(error); }); 
    }	  
  5. Skrypt JavaScript zawierający funkcjonalność Fetch.

    Plik ajax1c.js - ( [listing dokumentu] [link do dokumentu]

    function sendRequest() {
      fetch("../../cgi-bin/TI_2025/lab07/ajax_hello.py")
        // .then(response => {console.log(response);})
        .then(response => response.text())
        .then(data => {
    	    console.log(data);
    	    alert(data);
         })	
        .catch(error => console.log("Błąd: ", error));	
    } 
      

Status silnika AJAX

W następnym przykładzie przedstawione zostaną stany silnika AJAX. Do realizacji zadania wykorzystamy skrypt CGI z poprzedniego zadania.

  1. Plik "ajax2.html" z kodem HTML5.

    Plik ajax2.html - ( [listing dokumentu] [link do dokumentu]

    <!DOCTYPE html>
    <html>
       <head>
          <title>Ajax: Przyklad 2</title>
          <script src="ajax2b.js" type="text/javascript"></script>
       </head>
       <body>
         <div style="text-align:center" >
           <table border="1" >
             <tr><th>Ajax: Drugi skrypt</th></tr>
           </table>
           <br />
           <form action="#">
              <input type="button" value="Pokaz informacje" onclick="sendRequest()"/>
           </form>
           <div id="MyDivElement"></div>
         </div>
        </body>
    </html>
      
  2. Skrypt w języku JavaScript realizujący wymaganą funkcjonalność (XHR level 1).

    Plik ajax2a.js - ( [listing dokumentu] [link do dokumentu]

    var xmlHttp;
    function getRequestObject()      {
           if ( window.ActiveXObject)  {
                return ( new ActiveXObject("Microsoft.XMLHTTP")) ;
            } else if (window.XMLHttpRequest)  {
               return (new XMLHttpRequest())  ;
            } else {
               return (null) ;
            }
      }
    function sendRequest()      {
           xmlHttp = getRequestObject() ;
           if (xmlHttp) {
             try {    
               xmlHttp.onreadystatechange = handleResponse ;
               xmlHttp.open("GET", "../../cgi-bin/TI_2025/lab07/ajax_hello.py", true);
               xmlHttp.send(null);
             }
             catch (e) {
               alert ("Nie można połączyć się z serwerem: " + e.toString()) ;
             }
           } else {
             alert ("Błąd") ;
           }
      }
    function handleResponse()      {
        myDiv = document.getElementById("MyDivElement");
        if (xmlHttp.readyState == 1) {
               myDiv.innerHTML += "Status zadania: 1 (laduje)<br/>" ;
        } 
        else if (xmlHttp.readyState == 2) {
               myDiv.innerHTML += "Status zadania: 2 (zaladowany)<br/>" ;
        }
        else if (xmlHttp.readyState == 3) {
               myDiv.innerHTML += "Status zadania: 3 (interaktywny)<br/>" ;
        }
        else if (xmlHttp.readyState == 4) {
             if ( xmlHttp.status == 200 )  {
                 response = xmlHttp.responseText;
                 myDiv.innerHTML += "Status zadania: 4 (zakonczony)<br/>" ;
                 myDiv.innerHTML += response ;
             }
        }  
    }
      
  3. Skrypt w języku JavaScript realizujący wymaganą funkcjonalność (XHR level 2).

    Plik ajax2b.js - ( [listing dokumentu] [link do dokumentu]

    function sendRequest() {
      const xhr = new XMLHttpRequest();
      var myDiv = document.getElementById("MyDivElement");
      myDiv.innerHTML += "Status zadania: " + xhr.readyState + "<br/>" ;
      xhr.open("GET", "../../cgi-bin/TI_2025/lab07/ajax_hello.py", true);
      myDiv.innerHTML += "Status zadania: " + xhr.readyState + "<br/>" ;	
      xhr.addEventListener("load", e => {
        if (xhr.readyState == 1) {
               myDiv.innerHTML += "Status zadania: 1 (laduje)<br/>" ;
        } 
        else if (xhr.readyState == 2) {
               myDiv.innerHTML += "Status zadania: 2 (zaladowany)<br/>" ;
        }
        else if (xhr.readyState == 3) {
               myDiv.innerHTML += "Status zadania: 3 (interaktywny)<br/>" ;
        }
        else if (xhr.readyState == 4) {
             if ( xhr.status == 200 )  {
                 response = xhr.response;
                 myDiv.innerHTML += "Status zadania: 4 (zakonczony)<br/>" ;
                 myDiv.innerHTML += response ;
             }
        }
      })	  
      xhr.addEventListener("progress", e => {
         myDiv.innerHTML += "Status zadania: " + xhr.readyState + " (progress) <br/>" ;  
      });
     
      xhr.addEventListener("error", e => {
        alert("Nie udało się nawiązać połączenia");
      });
    
      xhr.send();
    }
    
    
      

Obsługa wierszy nagłówkowych protokołu HTTP

Do realizacji zadania wykorzystamy plik ajax_text.py, ajax3.html i ajax3.js.

  1. Plik "ajax_text.py" z skryptem w języku python.

    Plik ajax_text.py - ( [listing dokumentu] [link do dokumentu]

    #!/usr/bin/python3
    import time
    print ("Content-Type: text/plain")
    print ("Expires: Wed, 23 Dec 1980 00:30:00 GMT")
    print ("Last-Modified: %s GMT" % time.strftime("%a, %d %b %Y %H:%M:%S", time.gmtime()))
    print ("Cache-Control: no-cache, no-store, max-age=0, must-revalidate")
    print ("Pragma: no-cache")
    print ()
    print ("""\
    Hello, AJAX, Time %s 
    """  % time.strftime("%a, %d %b %Y %H:%M:%S", time.gmtime()))
      
  2. Plik "ajax3.html" z kodem HTML5.

    Plik ajax3.html - ( [listing dokumentu] [link do dokumentu]

    <!DOCTYPE html>
    <html>
       <head>
          <title>Ajax: Przyklad 3</title>
          <script src="ajax3c.js" type="text/javascript"></script>
       </head>
       <body>             
         <div style="text-align:center" >
           <table border="1" >
             <tr><th>Ajax: Trzeci skrypt</th></tr>
           </table>
           <br />
           <form action="#">
              <input type="button" value="Pokaz informacje" onclick="sendRequest()"/>
           </form>
           <div id="MyDivElement"></div>
         </div>
        </body>
    </html>
      
  3. Skrypt w języku JavaScript realizujący wymaganą funkcjonalność (XHR level 1).

    Plik ajax3a.js - ( [listing dokumentu] [link do dokumentu]

    var xmlHttp;
    function getRequestObject()      {
           if ( window.ActiveXObject)  {
                return ( new ActiveXObject("Microsoft.XMLHTTP")) ;
            } else if (window.XMLHttpRequest)  {
               return (new XMLHttpRequest())  ;
            } else {
               return (null) ;
            }
      }
    function sendRequest()      {
           xmlHttp = getRequestObject() ;
           if (xmlHttp) {
             try {    
               xmlHttp.onreadystatechange = handleResponse ;
               xmlHttp.open("GET", "../../cgi-bin/TI_2025/lab07/ajax_text.py", true);
               xmlHttp.send(null);
             }
             catch (e) {
               alert ("Nie mozna polaczyc sie z serwerem: " + e.toString()) ;
             }
           } else {
             alert ("Blad") ;
           }
      }
    function handleResponse()      {
        myDiv = document.getElementById("MyDivElement");
        if (xmlHttp.readyState == 1) {
               myDiv.innerHTML += "Status zadania: 1 (laduje)<br/>" ;
        } 
        else if (xmlHttp.readyState == 2) {
               myDiv.innerHTML += "Status zadania: 2 (zaladowany)<br/>" ;
        }
        else if (xmlHttp.readyState == 3) {
               myDiv.innerHTML += "Status zadania: 3 (interaktywny)<br/>" ;
        }
        else if (xmlHttp.readyState == 4) {
             if ( xmlHttp.status == 200 )  {
                 response = xmlHttp.responseText;
                 myDiv.innerHTML += "Status zadania: 4 (zakonczony)<br/>" ;
                 myDiv.innerHTML += response + "<br/>" ;
                 myDiv.innerHTML += "<pre>" + xmlHttp.getAllResponseHeaders() + "</pre><br />" ;
             }
        }  
    }
    
      
  4. Skrypt w języku JavaScript realizujący wymaganą funkcjonalność (XHR level 2).

    Plik ajax3b.js - ( [listing dokumentu] [link do dokumentu]

    function sendRequest() {
      const xhr = new XMLHttpRequest();
      var myDiv = document.getElementById("MyDivElement");
      xhr.open("GET", "../../cgi-bin/TI_2025/lab07/ajax_text.py", true);	
      xhr.addEventListener("load", e => {
        if ( xhr.status == 200 )  {
             response = xhr.response;
             myDiv.innerHTML += response + "<br/>";
             myDiv.innerHTML += "<pre>" + xhr.getAllResponseHeaders() + "</pre><br />" ;
        }
      })	  
      xhr.addEventListener("progress", e => {
         myDiv.innerHTML += "Status zadania: " + xhr.readyState + " (progress) <br/>" ;  
      });
     
      xhr.addEventListener("error", e => {
        alert("Nie udało się nawiązać połączenia");
      });
    
      xhr.send();
    }
      
  5. Skrypt w języku JavaScript realizujący wymaganą funkcjonalność (Fetch).

    Plik ajax3c.js - ( [listing dokumentu] [link do dokumentu]

    function sendRequest() {
      var myDiv = document.getElementById("MyDivElement");
      var txt ='';
      var info ='';
      fetch("../../cgi-bin/TI_2025/lab07/ajax_text.py")
        .then(response => { 
                response.text().then( data => {
                  // console.log(data);
                  myDiv.innerHTML += data ;
                }) ;
                for (let [key, value] of response.headers) {
                  txt += `${key} = ${value} <br/>`;
                  // console.log(`${key} = ${value} <br/>`);             
                } 
                myDiv.innerHTML += txt  ;
        })
        .catch(error => console.log("Błąd: ", error)); 
    }   

Przesyłanie danych metodą GET protokołu HTTP

Do realizacji ćwiczenia wykorzystamy odpowiednio pliki: ajax_form.py, ajax4.html i ajax4.js.

  1. Plik "ajax_form.py" z skryptem w języku python.

    Plik ajax_form.py - ( [listing dokumentu] [link do dokumentu]

    #!/usr/bin/python3
    from os import environ
    import cgi
    import cgitb; cgitb.enable()
    form = cgi.FieldStorage()
    info = form.getvalue("info", "(no info)")
     
    print ("Content-Type: text/html")
    print ()
    print ("""\
    <p>Env:</p>
    <table>
    <tr><td>REQUEST_METHOD: </td><td>%s</td></tr>
    <tr><td>QUERY_STRING: </td><td>%s</td></tr>
    </table>
    <p>Wartosc zmiennej 'info': %s</p>
    """ %  (environ['REQUEST_METHOD'], environ['QUERY_STRING'], html.escape(info)))
      
  2. Plik "ajax4.html" z kodem HTML5.

    Plik ajax4.html - ( [listing dokumentu] [link do dokumentu]

    <!DOCTYPE html>
    <html>
       <head>
          <title>Ajax: Przyklad 4</title>
          <script src="ajax4c.js" type="text/javascript"></script>
       </head>
       <body>
         <div style="text-align:center" >
           <table border="1" >
             <tr><th>Ajax: Czwarty skrypt</th></tr>
           </table>
           <br />
           <form action="#">
              Dowolny tekst: <input id="info" name="info" /><br />  
              <input type="button" value="Pokaz informacje" onclick="sendRequest()"/>
           </form>
           <div id="MyDivElement"></div>
         </div>
        </body>
    </html>  
  3. Skrypt w języku JavaScript realizujący wymaganą funkcjonalność (XHR level 1).

    Plik ajax4a.js - ( [listing dokumentu] [link do dokumentu]

    var xmlHttp;
    function getRequestObject()      {
           if ( window.ActiveXObject)  {
                return ( new ActiveXObject("Microsoft.XMLHTTP")) ;
            } else if (window.XMLHttpRequest)  {
               return (new XMLHttpRequest())  ;
            } else {
               return (null) ;
            }
      }
    function sendRequest()      {
           xmlHttp = getRequestObject() ;
           if (xmlHttp) {
             try {
               var info = document.getElementById('info').value ;    
               var url = "../../cgi-bin/TI_2025/lab07/ajax_form.py" ;
               url += "?info=" + info;
               xmlHttp.onreadystatechange = handleResponse ;
               xmlHttp.open("GET", url, true);
               xmlHttp.send(null);
             }
             catch (e) {
               alert ("Nie mozna polaczyc sie z serwerem: " + e.toString()) ;
             }
           } else {
             alert ("Blad") ;
           }
      }
    function handleResponse()      {
        myDiv = document.getElementById("MyDivElement");
        if (xmlHttp.readyState == 4) {
             if ( xmlHttp.status == 200 )  {
                 response = xmlHttp.responseText;
                 myDiv.innerHTML += "Status zadania: 4 (zakonczony)<br/>" ;
                 myDiv.innerHTML += response + "<br/>" ;
                 myDiv.innerHTML += "<pre>" + xmlHttp.getAllResponseHeaders() + "</pre><br />" ;
             }
        }  
    }
      
  4. Skrypt w języku JavaScript realizujący wymaganą funkcjonalność (XHR level 2).

    Plik ajax4b.js - ( [listing dokumentu] [link do dokumentu]

    function sendRequest() {
      const xhr = new XMLHttpRequest();
      var myDiv = document.getElementById("MyDivElement");
      var info = document.getElementById('info').value ;    
      var url = "../../cgi-bin/TI_2025/lab07/ajax_form.py" ;
      url += "?info=" + info;
      xhr.open("GET", url, true);	
      xhr.addEventListener("load", e => {
        if ( xhr.status == 200 )  {
             response = xhr.response;
             myDiv.innerHTML += response + "<br/>";
             // myDiv.innerHTML += "<pre>" + xhr.getAllResponseHeaders() + "</pre><br />" ;
        }
      })	  
      xhr.addEventListener("progress", e => {
         myDiv.innerHTML += "Status zadania: " + xhr.readyState + " (progress) <br/>" ;  
      });
     
      xhr.addEventListener("error", e => {
        alert("Nie udało się nawiązać połączenia");
      });
    
      xhr.send();
    }
      
  5. Skrypt w języku JavaScript realizujący wymaganą funkcjonalność (Fetch).

    Plik ajax4c.js - ( [listing dokumentu] [link do dokumentu]

    function sendRequest() {
      var myDiv = document.getElementById("MyDivElement");
      var info = document.getElementById('info').value ;    
      var url = "../../cgi-bin/TI_2025/lab07/ajax_form.py" ;
      url += "?info=" + info;  
      var txt ='';
      var info ='';
      fetch(url)
        .then(response => { 
                response.text().then( data => {
                  // console.log(data);
                  myDiv.innerHTML += data ;
                }) ;
                //for (let [key, value] of response.headers) {
                //  txt += `${key} = ${value} <br/>`;
                //  // console.log(`${key} = ${value} <br/>`);             
                //} 
                myDiv.innerHTML += txt  ;
        })
        .catch(error => console.log("Błąd: ", error)); 
    }   

Przesyłanie danych metodą POST prokołu HTTP

W ramach przykładu przedstawiono poprawną strukturę skryptów do obsługi metody POST. Do realizacji zadania wykorzystamy plik w języku python z poprzedniego zadania. Odpowiednie pliki w języku html i JavaScript przedstawiono poniżej.

  1. Plik "ajax5.html" z kodem HTML5.

    Plik ajax5.html - ( [listing dokumentu] [link do dokumentu]

    <!DOCTYPE html>
    <html>
       <head>
          <title>Ajax: Przyklad 5</title>
          <script src="ajax5c.js" type="text/javascript"></script>
       </head>
       <body>
         <div style="text-align:center" >
           <table border="1" >
             <tr><th>Ajax: Piaty skrypt</th></tr>
           </table>
           <br />
           <form action="#"  >
              Dowolny tekst: <input id="info" name="info" /><br />  
              <input type="button" value="Pokaz informacje" onclick="sendRequest()"/>
           </form>
           <div id="MyDivElement"></div>
         </div>
        </body>
    </html>
      
  2. Skrypt w języku JavaScript realizujący wymaganą funkcjonalność (XHR level 1).

    Plik ajax5a.js - ( [listing dokumentu] [link do dokumentu]

    var xmlHttp;
    function getRequestObject()      {
           if ( window.ActiveXObject)  {
                return ( new ActiveXObject("Microsoft.XMLHTTP")) ;
            } else if (window.XMLHttpRequest)  {
               return (new XMLHttpRequest())  ;
            } else {
               return (null) ;
            }
      }
    function sendRequest()      {
           xmlHttp = getRequestObject() ;
           if (xmlHttp) {
             try {
               var info = document.getElementById('info').value ;    
               var url = "../../cgi-bin/TI_2025/lab07/ajax_form.py" ;
               var data = "info=" + encodeURIComponent(info) ;
               xmlHttp.onreadystatechange = handleResponse ;
               xmlHttp.open("POST", url, true);
               xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded") ;
               xmlHttp.send(data);
             }
             catch (e) {
               alert ("Nie mozna polaczyc sie z serwerem: " + e.toString()) ;
             }
           } else {
             alert ("Blad") ;
           }
      }
    function handleResponse()      {
        myDiv = document.getElementById("MyDivElement");
        if (xmlHttp.readyState == 4) {
             if ( xmlHttp.status == 200 )  {
                 response = xmlHttp.responseText;
                 myDiv.innerHTML += "Status zadania: 4 (zakonczony)<br/>" ;
                 myDiv.innerHTML += response + "<br/>" ;
                 myDiv.innerHTML += "<pre>" + xmlHttp.getAllResponseHeaders() + "</pre><br />" ;
             }
        }  
    }
      
  3. Skrypt w języku JavaScript realizujący wymaganą funkcjonalność (XHR level 2).

    Plik ajax5b.js - ( [listing dokumentu] [link do dokumentu]

    function sendRequest() {
      const xhr = new XMLHttpRequest();
      var myDiv = document.getElementById("MyDivElement");
      var info = document.getElementById('info').value ;    
      var url = "../../cgi-bin/TI_2025/lab07/ajax_form.py" ;
      var data = encodeURI("info=" + info) ;
    
      xhr.open("POST", url, true);
      xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    	
      xhr.addEventListener("load", e => {
        if ( xhr.status == 200 )  {
             response = xhr.response;
             myDiv.innerHTML += response + "<br/>";
             // myDiv.innerHTML += xhr.getAllResponseHeaders() + "<br />" ;
        }
      })
      	  
      xhr.addEventListener("progress", e => {
         myDiv.innerHTML += "Status zadania: " + xhr.readyState + " (progress) <br/>" ;  
      });
     
      xhr.addEventListener("error", e => {
        alert("Nie udało się nawiązać połączenia");
      });
    
      xhr.send(data);
    }
      
  4. Skrypt w języku JavaScript realizujący wymaganą funkcjonalność (Fetch).

    Plik ajax5c.js - ( [listing dokumentu] [link do dokumentu]

    function sendRequest() {
      var myDiv = document.getElementById("MyDivElement");
      var info = document.getElementById('info').value ;    
      var url = "../../cgi-bin/TI_2025/lab07/ajax_form.py" ;
      var data = encodeURI("info=" + info) ;
      var txt ='';
      var info ='';
      const headers = new Headers();
      headers.append("Content-type", "application/x-www-form-urlencoded");
      fetch(url, { method:"post", headers: headers, body: data } )
        .then(response => { 
                response.text().then( data => {
                  info = data ;
                  // console.log(data);
                  myDiv.innerHTML += info ;
                }) ;
                //for (let [key, value] of response.headers) {
                //  txt += `${key} = ${value} <br/>`;
                //  // console.log(`${key} = ${value} <br/>`);             
                //} 
                myDiv.innerHTML += txt  ;
        })
        .catch(error => console.log("Błąd: ", error)); 
    }   

Przesyłanie danych XML z sewera z wykorzystaniem AJAX'a

W ramach zadania zaprezentowane zostanie poprawna konfiguracja skryptów po stronie serwera do przesyłania danych XML oraz skrypt w języku JavaScript przetwarzający po stronie klienta.

  1. Plik "ajax_xml.py" z skryptem w języku python.

    Plik ajax_xml.py - ( [listing dokumentu] [link do dokumentu]

    #!/usr/bin/python3
    print ("Content-Type: application/xml")
    print ()
    print ("""\
    <?xml version=\"1.0\" ?>
    <students>
     <student>
       <fname>Adam</fname>
       <lname>Abacki</lname>
     </student>
     <student>
       <fname>Bogdan</fname>
       <lname>Babacki</lname>
     </student> 
    </students>
    """)
      
  2. Plik "ajax6.html" z kodem HTML5.

    Plik ajax6.html - ( [listing dokumentu] [link do dokumentu]

    <!DOCTYPE html>
    <html>
       <head>
          <title>Ajax: Przyklad 6</title>
          <script src="ajax6b.js" type="text/javascript"></script>
       </head>
       <body>
         <div style="text-align:center" >
           <table border="1" >
             <tr><th>Ajax: Szosty skrypt</th></tr>
           </table>
           <br />
           <form action="#"  >
              <input type="button" value="Pokaz informacje" onclick="sendRequest()"/>
           </form>
           <div id="MyDivElement"></div>
         </div>
        </body>
    </html>
      
  3. Skrypt w języku JavaScript realizujący wymaganą funkcjonalność (XHR level 1).

    Plik ajax6a.js - ( [listing dokumentu] [link do dokumentu]

    var xmlHttp;
    function getRequestObject()      {
           if ( window.ActiveXObject)  {
                return ( new ActiveXObject("Microsoft.XMLHTTP")) ;
            } else if (window.XMLHttpRequest)  {
               return (new XMLHttpRequest())  ;
            } else {
               return (null) ;
            }
      }
    function sendRequest()      {
           xmlHttp = getRequestObject() ;
           if (xmlHttp) {
             try {
               var url = "../../cgi-bin/TI_2025/lab07/ajax_xml.py" ;
               xmlHttp.onreadystatechange = handleResponse ;
               xmlHttp.open("GET", url, true);
               xmlHttp.send(null);
             }
             catch (e) {
               alert ("Nie mozna polaczyc sie z serwerem: " + e.toString()) ;
             }
           } else {
             alert ("Blad") ;
           }
      }
    function handleResponse()      {
        myDiv = document.getElementById("MyDivElement");
        if (xmlHttp.readyState == 4) {
             if ( xmlHttp.status == 200 )  {
                 response = xmlHttp.responseXML;
                 myDiv.innerHTML += "Status zadania: 4 (zakonczony)<br/>" ;
                 myDiv.innerHTML += response + "<br/>" ;
                 var xmlRoot = response.documentElement ;
                 var fnameArray = xmlRoot.getElementsByTagName('fname') ;
                 var lnameArray = xmlRoot.getElementsByTagName('lname') ;
                 var html = "" ;
                 for ( var i=0; i<fnameArray.length; i++) 
                     html += fnameArray.item(i).firstChild.data + " " 
                           + lnameArray.item(i).firstChild.data + "<br/>" ;
                 myDiv.innerHTML += html ;
                 myDiv.innerHTML += "<pre>" + xmlHttp.getAllResponseHeaders() + "</pre><br />" ;
             }
        }  
    }
      
  4. Skrypt w języku JavaScript realizujący wymaganą funkcjonalność (XHR level 2).

    Plik ajax6b.js - ( [listing dokumentu] [link do dokumentu]

    function sendRequest() {
      const xhr = new XMLHttpRequest();
      var myDiv = document.getElementById("MyDivElement");  
      var url = "../../cgi-bin/TI_2025/lab07/ajax_xml.py" ;
      xhr.open("GET", url, true);	
      xhr.addEventListener("load", e => {
        if ( xhr.status == 200 )  {
             response = xhr.responseXML;
             myDiv.innerHTML += response + "<br/>" ;
             var xmlRoot = response.documentElement ;
             var fnameArray = xmlRoot.getElementsByTagName('fname') ;
             var lnameArray = xmlRoot.getElementsByTagName('lname') ;
             var html = "" ;
             for ( var i=0; i<fnameArray.length; i++) 
                 html += fnameArray.item(i).firstChild.data + " " 
                      + lnameArray.item(i).firstChild.data + "<br/>" ;
             myDiv.innerHTML += html ;
             // myDiv.innerHTML += xmlHttp.getAllResponseHeaders() + "<br />" ;
             // myDiv.innerHTML += response + "<br/>";
             // myDiv.innerHTML += xhr.getAllResponseHeaders() + "<br />" ;
        }
      })	  
      xhr.addEventListener("progress", e => {
         myDiv.innerHTML += "Status zadania: " + xhr.readyState + " (progress) <br/>" ;  
      });
     
      xhr.addEventListener("error", e => {
        alert("Nie udało się nawiązać połączenia");
      });
    
      xhr.send();
    }
      
  5. Skrypt w języku JavaScript realizujący wymaganą funkcjonalność (Fetch).

    Plik ajax6c.js - ( [listing dokumentu] [link do dokumentu]

      

Przesyłanie danych w formacie JSON

W ramach zadania zaprezentowane zostanie poprawna konfiguracja skryptów po stronie serwera i przeglądarki do przesyłania danych w formacie JSON. Do realizacji zadania wykorzystamy pliki: ajax_json.py, ajax7.html oraz ajax7a.js, ajax7b.js i ajax7c.js.

  1. Plik "ajax_json.py" z skryptem w języku python.

    Plik ajax_json.py - ( [listing dokumentu] [link do dokumentu]

    #!/usr/bin/env python3
    print ("Content-Type: application/json")
    print ()
    print ("""\
    {"students" : [
    {"fname":"Adam", "lname":"Abacki"},
    {"fname":"Bogdan", "lname":"Babacki"}
    ]}
    """)
      
  2. Plik "ajax7.html" z kodem HTML5.

    Plik ajax7.html - ( [listing dokumentu] [link do dokumentu]

    <!DOCTYPE html>
    <html>
       <head>
          <title>Ajax: Przyklad 7</title>
          <script src="ajax7c.js" type="text/javascript"></script>
       </head>
       <body>
         <div style="text-align:center" >
           <table border="1" >
             <tr><th>Ajax: Siodmy skrypt</th></tr>
           </table>
           <br />
           <form action="#"  >
              <input type="button" value="Pokaz informacje" onclick="sendRequest()"/>
           </form>
           <div id="MyDivElement"></div>
         </div>
        </body>
    </html>
      
  3. Skrypt w języku JavaScript realizujący wymaganą funkcjonalność (XHR level 1).

    Plik ajax7a.js - ( [listing dokumentu] [link do dokumentu]

    var xmlHttp;
    function getRequestObject()      {
           if ( window.ActiveXObject)  {
                return ( new ActiveXObject("Microsoft.XMLHTTP")) ;
            } else if (window.XMLHttpRequest)  {
               return (new XMLHttpRequest())  ;
            } else {
               return (null) ;
            }
      }
    function sendRequest()      {
           xmlHttp = getRequestObject() ;
           if (xmlHttp) {
             try {
               var url = "../../cgi-bin/TI_2025/lab07/ajax_json.py" ;
               xmlHttp.onreadystatechange = handleResponse ;
               xmlHttp.open("GET", url, true);
               xmlHttp.send(null);
             }
             catch (e) {
               alert ("Nie mozna polaczyc sie z serwerem: " + e.toString()) ;
             }
           } else {
             alert ("Blad") ;
           }
      }
    function handleResponse()      {
        myDiv = document.getElementById("MyDivElement");
        if (xmlHttp.readyState == 4) {
             if ( xmlHttp.status == 200 )  {
                 response = xmlHttp.response;
                 myDiv.innerHTML += "Status zadania: 4 (zakonczony)<br/>" ;
                 myDiv.innerHTML += response + "<br/>" ;
                 var dataJSON  = JSON.parse(response) ;
                 html = "" ;
                 for ( var i=0; i<dataJSON.students.length ; i++)
                   html += dataJSON.students[i].fname + " " + dataJSON.students[i].lname + "<br/>" ;
                 myDiv.innerHTML += html ;
                 myDiv.innetHTML += dataJSON + "<br/>" ;
                 myDiv.innerHTML += "<pre>" + xmlHttp.getAllResponseHeaders() + "</pre><br />" ;
             }
        }  
    }
      
  4. Skrypt w języku JavaScript realizujący wymaganą funkcjonalność (XHR level 2).

    Plik ajax7b.js - ( [listing dokumentu] [link do dokumentu]

    function sendRequest() {
      const xhr = new XMLHttpRequest();
      var myDiv = document.getElementById("MyDivElement");  
      var url = "../../cgi-bin/TI_2025/lab07/ajax_json.py" ;
      xhr.open("GET", url, true);
      xhr.responseType = "json" ;	
      xhr.addEventListener("load", e => {
        if ( xhr.status == 200 )  {
             response = xhr.response;
             console.log(response);
             html = "" ;
             for ( let i=0; i<response.students.length ; i++)
                   html += response.students[i].fname + " " + response.students[i].lname + "<br/>" ;
             myDiv.innerHTML += html ;
             // myDiv.innerHTML += xmlHttp.getAllResponseHeaders() + "<br />" ;
             // myDiv.innerHTML += response + "<br/>";
             // myDiv.innerHTML += xhr.getAllResponseHeaders() + "<br />" ;
        }
      })	  
      xhr.addEventListener("progress", e => {
         myDiv.innerHTML += "Status zadania: " + xhr.readyState + " (progress) <br/>" ;  
      });
     
      xhr.addEventListener("error", e => {
        alert("Nie udao si nawiza poczenia");
      });
    
      xhr.send();
    }
      
  5. Skrypt w języku JavaScript realizujący wymaganą funkcjonalność (Fetch).

    Plik ajax7c.js - ( [listing dokumentu] [link do dokumentu]

    function sendRequest() {
      var myDiv = document.getElementById("MyDivElement"); 
      var url = "../../cgi-bin/TI_2025/lab07/ajax_json.py" ;
      var txt ='';
      var info ='';
      fetch(url)
        .then(response => { 
                response.json().then( data => {
                  html = "" ;
                  for ( let i=0; i<data.students.length ; i++)
                    html += data.students[i].fname + " " + data.students[i].lname + "<br/>" ;
                  myDiv.innerHTML += html ;
                }) ;
                //for (let [key, value] of response.headers) {
                //  txt += `${key} = ${value} <br/>`;
                //  // console.log(`${key} = ${value} <br/>`);             
                //} 
                myDiv.innerHTML += txt  ;
        })
        .catch(error => console.log("Bd: ", error)); 
    }   

Linki do uruchomionych przykładów na serwerze Pascal (2025)

Linki dostępne z sieci wydziałowej.