2016-06-22 15 views
0

Welche CGI-API können Sie $.getJSON() mit $(ajax)...POST ersetzen. GET wird für alles verwendet (zB: GET, PUT, POST, DELETE) wenn CGIDEV2 in einer IBM i-Umgebung verwendet wird? Ich möchte meine Parameter nicht auf die traditionelle Weise übergeben zB: $('[name="EMAIL"]').val() Ich möchte lieber JSON Objekt String übergeben zB: {"form" : [{ "email": "[email protected]"}]}.

Wir sind in der Lage PostToGet Rückrufe mit der $.getJSON() mit CGIDEV2 aber ich kann nicht verwenden $.ajax in vollem auszuführen. Hier ist, was wir jetzt tun, das ist alles GET Anfragen

PHP/JS:

// load all parameters 
data = 'INSTANCE=<?echo trim($PATH_INSTANCE)?>' + 
     '&FUNCTION=<?echo urlencode(trim($FUNCTIONCODE))?>' + 
     '&USER=' + $('[name="USER"]').val() + 
     '&CONTACT=' + w$('[name="CONTACT"]').val() + 
     '&EMAIL=' + $("input[name='EMAIL']").val() + 
     '&MSG=' + $('[name="MSG"]').val() + 
     '&TYPE=' + $('[name="TYPE"]').val(); 

    // Call the RPG REST JSONP program 
    $.getJSON("http://www.domain.com:8082/rest/RPGLEPGM?callback=?",data) 
      .done(function(json) { ... } 

    //Domain is actually 
    http://www.domain.com:8081 

RPGLE PGM:

Begsr $Incoming; 

     cgiPostToGet(); // Convert POST to GET 

     callback = cgiParseGet('callback'); // callback 

     p#Function = cgiParseGet('FUNCTION');  
Endsr;  

Aber ich will in der Lage sein, den anderen zu verwenden AJAX-Methoden, die verschiedene Aktionen ausführen, wie z. B. einfaches Aktualisieren von Datensätzen .post()/.ajax() on the fly oder einfache .get() Ajax-Aufrufe, ohne einen Rückruf zu erstellen. Ich möchte getJSON nicht jedes Mal verwenden müssen, wenn ich Ajax nutze, um seine schlechte Praxis zu erwähnen, auf einem GET zu POST zu gehen, aber von dem, was ich verstehe, bietet JSONP-Funktionalität, während die anderen nicht standardmäßig sind.

EDIT: Wir tun unser Ajax RPGLE PGMS auf einem anderen Port als die tatsächliche Website haben so JSONP notwendig ist und der Kunde kennt seine JSONP, weil wir die callback Funktion zurückzugeben.

Antwort

0

Leider können Sie POST mit JSONP aber Sie können nicht die Header-Antwort lesen.

Ich fand schließlich die Lösung zum Ausführen von db2 und ajax Anforderungen auf einer einzigen DOMAIN.

SOLUTION HIER

Wenn Sie AJAX-Anforderungen auf dem gleichen Gebiet in einer IBMi Umgebung w/Apache/PASE benötigen Sie bitte die folgenden ScriptAlias und zwei Richtlinien in Ihrem http.conf Datei auszuführen:

ScriptAliasMatch /rest/([0-9a-zA-Z]+$) /qsys.lib/rest.lib/$1.pgm 

<Directory /qsys.lib/obj.lib/> 
    order allow,deny 
    allow from all 
    Header Always Set Access-Control-Allow-Origin * 
    Options +ExecCGI +Includes -Indexes +MultiViews 
    CGIConvMode %%MIXED/MIXED%% 
</Directory> 

<Directory /qsys.lib/rest.lib> 
    CGIConvMode %%EBCDIC/EBCDIC%%  
    Order Allow,Deny   
    Allow From all   
    Header Always Set Access-Control-Allow-Origin * 
    Options +ExecCGI -FollowSymLinks -SymLinksIfOwnerMatch +Includes -IncludesNoExec -Indexes -MultiViews  
</Directory> 

rest.lib Mitglied ist, wo alle der ajax RPGLE PGMs befinden.

obj.lib ist, wo alle CALL WEBXXX für db2 Anrufe in PHP befinden.

Jetzt können Sie AJAX-Anfragen unter dem /rest/$1PGM Muster aufrufen.

Zum Beispiel:

$.ajax({ 
     type: "POST", 
     url: "http://www.domain.com/rest/WEB055S", 
     data: obj, 
     contentType: "application/json; charset=utf-8" 
     ). 
     done(function(data){ 
       $("#signupForm .loading").addClass("hidden"); 
       //Successful Submit! 
       if(typeof data.MESSAGE != "undefined"){ 
        clicked = 0; 
        $("#ok_msg").html(data.MESSAGE).show();  
       } 
       else{//ERROR 
       //console.log(data.ERROR); 
       $("#attendee #hth_err_msg").html(data.ERROR).show(); 
       $('.add-attendee').addClass('hidden'); 
       $('.edit-attendee').addClass('hidden'); 
       } 
     }). 
     fail(function(){ 
      $("#hth_err_msg").html("We're sorry, you're request cannot be processed at this time. It is likely the corporate system is under maintenance.").show(); 
     }); 
0

Da sich unsere ajax RPGLE PGM CALLS auf einem anderen Port befinden als die PHP-Anfragen (denken Sie an verschiedene Domänen auf einem Host-Server), gelten diese als domainübergreifende Anfragen; Daher müssen wir die &callback=? Funktion/Wrapper mit JSONP an den Client zurückgeben (oder Cors, wenn Sicherheit ein Problem ist). Ich fand ein wirklich gutes Stück auf hier auf SO und das ist genau das, was dieser Ajax-Aufruf verwendet.

RPGLE Die jQuery ajax-Anfragen werden durch eine Art von CGI-API ermöglicht, auf die in Ihrer OS/400-IBM i-Webumgebung zugegriffen werden kann. Wenn wir (CALLB oder CALLP) ein RPGLE PGM mit Ajax aufrufen, führen wir eigentlich einen prozeduralen Aufruf aus, aber wenn wir globale Zeitstempel verwenden, machen wir tatsächlich einen SQL Procedural CALL, der in Bezug auf Ressourcen viel teurer ist, weshalb Web Services immer mehr werden Beliebt.

Es ist praktischer, JavaScript-Objekte nicht nur auf Anforderung von den Formulardaten zu übergeben, sondern JSON-Objekte mit Ajax-Anforderungen zurückzugeben, als globale Temp-Daten in der db2-Umgebung zu speichern und sie in einem PHP-Array der Antwort zu verarbeiten.

Durch die Verarbeitung der JSON-Zeichenfolge auf dem Client anstelle der Verwendung von Serverspeicher und Laufwerksspeicher und Disk-Lese-/Schreiboperationen für PHP-Arrays und globale temporäre Dateien sind wir wirklich in der Lage, moderne Webdesign-Praktiken zu nutzen.

Hier ist ein funktionierendes Beispiel für die Verwendung $.ajax/PHP/RPGLE korrekt ohne $.getJSON() mit:

<script> 

$(document).ready(function(){ 
    GetEmail("#email", '<?php echo trim($USER)?>', '<?php echo $PATH_INSTANCE?>'); 
    FormValidation(); 
}); 

    function FormValidation(){ 
     //Variables created without the keyword var, are always global, even if they are created inside a function. 
     var form = $('#<?echo $PAGEID?>'); 
     var FormError = $('.alert-danger',form); 
     var success = $('.alert-success',form); 

     form.validate({ 

     focusInvalid: false, // do not focus the last invalid input 
     onkeyup: false, 
     ignore: ".ignore", //required for hidden input validation ie: hiddenRecaptcha 
     rules:{ 
      "TYPE": { 
       required: true,  
      }, 
      "MSG": { 
       required: true, 
       rangelength:[40,1000] 
      }, 
      "CONTACT": { 
       required: { 
        depends: "#newuser:checked" 
       } 
      }, 
      "EMAIL": { 
       required: true, 
       email: { 
        depends: function() { 
         if(!$("#newuser:checked")) 
          return true; 
         else 
          return false; 
        } 
       }, 
       HTH_TelephoneEmail: { 
         depends: function() { 
          if($("#newuser:checked")) 
           return true; 
          else 
           return false; 
         } 
        } 
      },   
      hiddenRecaptcha: { 
       required: function() { 
        if (grecaptcha.getResponse() == '') { 
         return true; 
        } else { 
         return false; 
        } 
       } 
      } 
     }, 
     messages: { // custom messages for form validation input 
       "TYPE": { 
        required: 'Please select an option as it pertains to your inquiry' 
       }, 
       "MSG": { 
        required: 'Please provide some content as it pertains to your inquiry'  
       }, 
       "CONTACT": { 
       required: "Please enter a contact person or company" 
       }, 
       hiddenRecaptcha: { 
       required: function() { 
        $(".g-recaptcha:first").tooltip("enable").tooltip("show"); 
       } 
       } 
     }, 
     showErrors: function(errorMap, errorList) { 
      // Clean up any tooltips for valid elements 
      $.each(this.validElements(), function (index, element) { 
       element = $(element); 
       NoError_ToolTip(element); 
      }); 
      // Create new tooltips for invalid elements 
      $.each(errorList, function (index, error) { 
       element = $(error.element); 
       message = error.message; 
       Error_ToolTip(element,message); 
      }); 
     },     
     invalidHandler: function (event, validator) { //display error alert on form submit  
      success.hide(); 
      $(document).scrollTop($(".form-body").offset().top); 
     }, 
     submitHandler: function() { 
      Submit_Complete(); 
      } 
    }); 

    function Submit_Complete(){ 

      var obj = form.serializeObject(); 
      console.log(obj); 

      $(".g-recaptcha:first").tooltip("disable").tooltip("hide"); 
      $('.shell').html('<div class="loading"><span class="caption">Sending...</span><img src="/images/loading.gif" alt="loading"></div>'); 

      $.ajax({ 
      type: "POST", 
      url: "http://www.domain.com:8082/rest/RPGPGM2?callback=?", 
      data: obj, 
      //contentType: "application/json; charset=utf-8", 
      dataType: "jsonp"}). 
      done(function(data){ 
       $(".shell").html('<label class="msg xs-small">' + data["MESSAGE"] + '</label><br><br><br><br><br><br><br><br><br>'+ 
       '<div class="caption right">'+ 
       '<a href="index.php" id="defaultActionButton" class="btn green">Home&nbsp;<i class="fa fa-home"></i></a>'+ 
       '</div>'); 
      }). 
      fail(function(){ 
       $(".shell").html("<label class='msg xs-small'>We're Sorry!<br><br><br><br><span class='text-danger'>Unfortunately this inquiry cannot be processed at this time." + 
       "<br>Please try again at a later time or give us a call at:</span><br><br>+1.800.406.1291</label><br><br><br><br><br><br><br><br><br>"+ 
         '<div class="caption right">'+ 
         '<a href="index.php" id="defaultActionButton" class="btn green">Home&nbsp;<i class="fa fa-home"></i></a>'+ 
         '</div>'); 
      }); 
    } 
} 

/** * Serialisiert Formulardaten/Objekte.Dies erzeugt tatsächlich ein JavaScript-Objekt, mit dem unsere CGIAPI umgehen kann! * */

$.fn.serializeObject = function() { 
    var o = {}; 
    var a = this.serializeArray(); 
    var $value = ''; 
    $.each(a, function() { 
     if (o[this.name]) { 
      if (!o[this.name].push) { 
       o[this.name] = [o[this.name]]; 
      } 
      o[this.name].push(this.value || ''); 
     } else { 
      o[this.name] = this.value || ''; 
     } 
    }); 
    return o; 
}; 

</script> 

Wir RESTful Anrufe unter Verwendung von irgendeiner Art von CGI-API wie QtmhRdStin oder durch die Schaffung von Web-Service machen. Diese Lösung ist von ersterem. Hier

ist eine Liste der grundlegenden CGI-APIs:

enter image description here

RPGLE PGM:

// $Incoming: Test and load the incoming parameters 

    Begsr $Incoming; 

    cgiPostToGet(); // Convert POST to GET 

    callback = cgiParseGet('callback'); // never delete - unique key for the request 

    p#UserID = cgiParseGet('USER'); 
    if (%scan(#lf:p#UserID) <> 0); 
     p#UserID = *blanks; 
    endif; 

    p#Instance = cgiParseGet('INSTANCE'); 
    if (%scan(#lf:p#Instance) <> 0); 
     p#Instance = *blanks; 
    endif; 

    p#Function = cgiParseGet('FUNCTION'); 

    p#Contact = cgiParseGet('CONTACT'); 
    if (%scan(#lf:p#Contact) <> 0); 
     p#Contact = *blanks; 
    endif; 

    p#Email = cgiParseGet('EMAIL'); 
    p#Msg = cgiParseGet('MSG'); 
    p#Related = cgiParseGet('TYPE'); 

    exsr $InzSr; 

    Endsr; 

     Begsr $Outgoing; 

      // Tell Consumer that a JSON string will be sent 
      ajx_data = 'Content-type: text/javascript' + CRLF + CRLF; // DO NOT CHANGE THIS LINE!!! 
      QtmhWrStout(ajx_data: %len(%trimr(ajx_data)): ajx_err);// DO NOT CHANGE THIS LINE!!! 
      ajx_data = %trim(callback) + '(' + %char(LBrace);  // DO NOT CHANGE THIS LINE!!! 
      QtmhWrStout(ajx_data: %len(%trimr(ajx_data)): ajx_err);// DO NOT CHANGE THIS LINE!!! 

      ajx_data = '"MESSAGE":"' + %trim(p#message) + '"'; 
      QtmhWrStout(ajx_data: %len(%trimr(ajx_data)): ajx_err); 

      // load the final right brace to complete the JSON string 
      ajx_data = %char(RBrace) + ');';       // DO NOT CHANGE THIS LINE!!! 
      QtmhWrStout(ajx_data: %len(%trimr(ajx_data)): ajx_err); // DO NOT CHANGE THIS LINE!!! 

     Endsr; 

**** HINWEIS ****

Wenn wir Kann unser Formular nicht direkt serialisieren, müssen wir ein JavaScript-Objekt wie dieses erstellen:

 var obj = {USER : localProfile, 
     INSTANCE : "HTHACKNEY", 
     PAGE : $('select[name="PAGE"]').val(), 
     TITLE : $("input[name='TITLE']").val(), 
     HTML : html, 
     STARTDATE : $("input[name='STARTDATE']").val(), 
     ENDDATE : $("input[name='ENDDATE']").val(), 
     ARCHIVE : $("input[name='ARCHIVE']").val(), 
     ACTIVE : $("input[name='ACTIVE']").val(), 
     URGENT : $("input[name='URGENT']").val(), 
     AUTHLST : authStr}; 

    $.ajax({ 
      type: "POST", 
      url: "http://webservices.hthackney.com/web054S?callback=?", 
      data: data, 
      dataType:'jsonp' 
     }).done({ //do something on success });