2016-06-28 6 views
1

Ich versuche, die Canada Post API direkt vom NetSuite-Client aus aufzurufen, um die Versandkosten zu erhalten.Aufruf von CanadaPost von NetSuite Client

Dies ist der Test-Code für devlopment:

var url = 'https://ct.soa-gw.canadapost.ca/rs/ship/price'; 
var auth = 'Basic BASE64ENCODEDUSERNAMEANDPASSWORD'; 
var xml = '' + 
'<?xml version="1.0" encoding="utf-8"?>' + 
'<mailing-scenario xmlns="http://www.canadapost.ca/ws/ship/rate-v3">' + 
'<customer-number>1234567</customer-number>' + 
'<parcel-characteristics><weight>1.0</weight></parcel-characteristics>' + 
'<services><service-code>DOM.XP</service-code></services>' + 
'<origin-postal-code>K2B8J6</origin-postal-code>' + 
'<destination><domestic><postal-code>J0E1X0</postal-code></domestic></destination>' + 
'</mailing-scenario>'; 

var header = { 
    'Authorization': auth, 
    'Content-Type': 'application/soap+xml;application/vnd.cpc.ship.rate-v3+xml', 
    'Accept-language': 'en-CA', 
    'Accept': 'application/vnd.cpc.ship.rate-v3+xml' 
}; 

var r = nlapiRequestURL(url, xml, header, null, 'POST'); 

console.log(r.code[0]); 
console.log(r.body); 

Die Anweisungen ziemlich klar sind und das XML-Format scheint richtig zu sein, aber ich halte die gleiche Antwort bekommen:

<?xml version="1.0" encoding="UTF-8"?> 
<messages xmlns="http://www.canadapost.ca/ws/messages"> 
<message> 
<code>400</code> 
<description>Backend Bad Request</description></message></messages> 

Jeder Hinweis ?

Referenz: https://www.canadapost.ca/cpo/mc/business/productsservices/developers/services/rating/getrates/default.jsf

* Edit: Ich habe auch versucht, 'Content-Type' mit: 'application/vnd.cpc.ship.rate-v3 + xml' und ich erhalte den folgenden Fehler:

<?xml version="1.0" encoding="UTF-8"?> 
<messages xmlns="http://www.canadapost.ca/ws/messages"> 
<message> 
<code>415</code> 
<description>Backend Unsupported Media Type</description></message></messages> 

Antwort

3

Das erste Problem ist Ihre Content-Type-Header ist falsch. Sie können solche Inhaltstypen nicht wirklich mischen. Die CP Website zeigt es

Content-Type: "application/vnd.cpc.ship.rate-v3+xml" 

Ihr Problem will explizit sein wird, dass NS heißt es, dass sie nur bestimmte respektieren Werte Content-Type werden:

Also note that if you call nlapiRequestURL, passing in the header with a content type, NetSuite respects the following types:

all text media types (types starting with "text/")
"application/json"
"application/vnd.maxmind.com-country+json"
"application/xml"
"application/soap+xml"
"application/xhtml+xml"
"application/atom+xml"
Otherwise, NetSuite will overwrite the content type with our default type as if the type had not been specified. NetSuite default types are:

"text/xml; charset=UTF-8"
"application/x-www-form-urlencoded; charset=UTF-8"

Was ich tun würde, wäre, ob zu testen CP lässt Sie mit Content-Type: "text/xml" oder "application/xml"

Wenn nicht, würde ich einen Fall mit beiden CP und NS in der Hoffnung, dass beide CP würde die generische Art erlauben oder NS würde einen bestimmten Typ zulassen. Halte nicht den Atem an.

was ich tatsächlich getan habe, um diese Art von Sache zu lösen, ist, nur die Anforderung durch ein System zu übertragen, das ich kontrolliere. Es ist ziemlich einfach, eine kleine App zu schreiben, die die Anfrage erhält; Setzen Sie die Header richtig zurück und leiten Sie die Anfrage weiter.

+0

Ich habe versucht, den Inhaltstyp zu ändern, und es gibt mir einen "Backend nicht unterstützten Medientyp" -Fehler. Das Skript wird derzeit über einen PHP-Proxy ausgeführt, um Anmeldeinformationen zu verarbeiten, aber wir möchten, dass der Refactor direkt vom Client ausgeführt wird. – pipechang

+2

Ich würde zuerst den technischen Support mit Canada Post gehen. Es gibt keinen guten Grund für ihre sehr spezifische Content-Typ-Anforderung. Es gibt keinen guten Grund für die Einschränkungen von Netsuite, aber viel Glück dort. – bknights

+0

Lol ... Ich tippte genau die gleiche Frage und die Schönheit, die StackOverflow & Joel Spoelsky ist erstaunlich ... es brachte mich hier ... Ich habe bereits eine Anfrage an die Canada Post Technical Department eingereicht und ich werde POST (Wortspiel beabsichtigt) die Antwort, sobald sie zurück zu mir kommen, weil Sie wissen, dass ich diese Upvotes will !!! LOL – lopezdp