2017-11-10 7 views
0

Ich versuche, eine sehr kleine benutzerdefinierte Webanwendung mit NetSuite zu integrieren. Ich möchte, dass ein benutzerdefinierter Datensatz in NetSuite erstellt wird, wenn ein Benutzer auf eine Schaltfläche in meiner Webanwendung klickt.Wie an benutzerdefinierte NetSuite-Datensatz von externer Website POST?

Ich habe ein RESTlet geschrieben, das mit der Chrome-Erweiterung REST API Testing funktioniert. Ich habe erfolgreich Datensätze über diese Chrome-Erweiterung erstellt.

Allerdings, wenn ich versuche, von meiner Web-Anwendung Post, bekomme ich diesen Fehler:

"Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access. The response had HTTP status code 401."

Wie kann ich auf NetSuite Post mit einem Restlet von einer externen Website? Sollte ich sogar ein RESTlet verwenden oder gibt es einen besseren Weg?

+0

, dass Ihr Browser und sein CORS ist Einstellung Wenn Chrom verwendet (Sie sollten sein;) – Coldstar

Antwort

3

RESTlets sind mehr als ein System zu System techn gemeint ologie. Sie benötigen eine Authentifizierung und wenn Sie dies von einer öffentlichen App aus tun, werden Ihre Anmeldedaten kompromittiert.

In Netsuite können Sie keinen CORS-Header festlegen, sodass Ihre domänenübergreifende Integration über ein öffentlich verfügbares Suletlet und JSONP erfolgen muss.

Da JSONP get-Anfragen verwendet, müssen Sie sicherstellen, dass Ihre URL-Parameter weniger als etwa 2k Zeichen lang sind. Das ist kein Standard-Limit so ymmv

Muster oft ich benutze: Client-Code:

var url = "public suitelet url from deployment screen"; 
    var params = { 
     mode: 'neworder', 
     //simple name/value data 
    }; 
    $.ajax({ 
      url: url+"&"+ $.param(params) +"&jsoncallback=?", 
      cache:false, 
      dataType:'json', 
      success: function(jResp){ 
       if(!jResp.success){ 
        if(jResp.message) alert(jResp.message); 
        return; 
       } 
       // act on the results 
      } 
    }); 

Eine Bibliotheksfunktion in der suitelet Quelldatei.

function _sendJSResponse(request, response, respObject){ 
    response.setContentType('JAVASCRIPT'); 
    //response.setHeader('Access-Control-Allow-Origin', '*'); 
    var callbackFcn = request.getParameter("jsoncallback") || request.getParameter('callback'); 
    if(callbackFcn){ 
     response.writeLine(callbackFcn + "(" + JSON.stringify(respObject) + ");"); 
    }else response.writeLine(JSON.stringify(respObject)); 
} 

und dann eine Suitelet Funktion

function service(request, response){ 
    ... do some work and generate a response 
    var returnObj = { 
     success:true, 
     message: '', 
     result:result 
    }; 

    _sendJSResponse(request, response, returnObj); 
} 
+0

Okay, aber wie kann ich einen benutzerdefinierten Datensatz mit einem extern verfügbaren SuiteTelet erstellen? Sind die APIs nicht begrenzt? Ich sehe nlapiCreateRecord nicht in dieser Liste: Siehe SuiteAnswers Artikel 10354 –

+0

Ich habe praktisch alles mit externen verfügbaren SuiteTelets gemacht. Sie können alles tun, was auf der Server-Seite innerhalb Ihres 1000-Einheiten-Governance-Limits getan werden kann. Erstellen Sie die Rolle für den Suite-Administrator. – bknights

+0

Super, das hat funktioniert! Vielen Dank. –

0

, dass Ihr Browser ist und seine CORS

Einstellung

Wenn Chrom verwendet (Sie sollten sein;) unter Windows), mit den folgenden Flags "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir

dann eine Chrom Verknüpfung erstellen, töten/neu starten alle Instanzen Chrom in dem Task-Manager und versuchen, Ihre Anfragen wieder

Ansonsten google "disable CORS auf MY_BROWSER"

+0

eine Verknüpfung mit den folgenden Flags) auf Windows, erstellen, die didn arbeite nicht für mich. –

Verwandte Themen