1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
public class NetsuiteDevToolsCtr { // NetSuite REST API base URL public static final String BASE_URL = 'https://xxxx-sb1.suitetalk.api.netsuite.com/services/rest/record/v1/metadata-catalog'; // NetSuite account credentials public static final String CONSUMER_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; public static final String CONSUMER_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; public static final String TOKEN_ID = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; public static final String TOKEN_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; public static final String REALM = 'xxxxxxxxxx_SB1'; public static void init() { HttpRequest req = new HttpRequest(); req.setMethod('GET'); req.setEndpoint(BASE_URL); req.setHeader('Accept', '*/*'); req.setHeader('Content-Type','application/json'); req.setTimeout(120000); NetsuiteDevToolsOAuth10a no = new NetsuiteDevToolsOAuth10a(TOKEN_ID, TOKEN_SECRET, REALM, CONSUMER_KEY, CONSUMER_SECRET); no.sign(req); system.debug(req.getHeader('Authorization')); Http http = new Http(); HttpResponse res; try { // 发送请求并接收响应 res = http.send(req); // 输出响应状态码和响应体 System.debug('Response Status: ' + res.getStatus()); System.debug('Response Body: ' + res.getBody()); } catch (Exception e) { // 处理异常 System.debug('Error: ' + e.getMessage()); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
global class NetsuiteDevToolsOAuth10a { private String token; private String tokenSecret; private String realm; private String verifier; private String nonce; private String timestamp; private String signature; private String consumerKey; private String consumerSecret; private Map<String,String> parameters = new Map<String,String>(); public NetsuiteDevToolsOAuth10a(String token, String tokenSecret, String realm, String consumerKey, String consumerSecret) { this.token = token; this.tokenSecret = tokenSecret; this.realm = realm; this.consumerKey = consumerKey; this.consumerSecret = consumerSecret; } private void refreshParameters() { parameters.clear(); parameters.put('realm',realm); parameters.put('oauth_consumer_key',consumerKey); if(token!=null) { parameters.put('oauth_token',token); } if(verifier!=null) { parameters.put('oauth_verifier',verifier); } parameters.put('oauth_signature_method','HMAC-SHA256'); parameters.put('oauth_timestamp',timestamp); parameters.put('oauth_nonce',nonce); parameters.put('oauth_version','1.0'); } private Map<String,String> getUrlParams(String value) { Map<String,String> res = new Map<String,String>(); if(value==null || value=='') { return res; } for(String s : value.split('&')) { System.debug('getUrlParams: '+s); List<String> kv = s.split('='); if(kv.size()>1) { // RFC 5849 section 3.4.1.3.1 and 3.4.1.3.2 specify that parameter names // and values are decoded then encoded before being sorted and concatenated // Section 3.6 specifies that space must be encoded as %20 and not + String encName = EncodingUtil.urlEncode(EncodingUtil.urlDecode(kv[0], 'UTF-8'), 'UTF-8').replace('+','%20'); String encValue = EncodingUtil.urlEncode(EncodingUtil.urlDecode(kv[1], 'UTF-8'), 'UTF-8').replace('+','%20'); System.debug('getUrlParams: -> '+encName+','+encValue); res.put(encName,encValue); } } return res; } private String createBaseString(Map<String,String> oauthParams, HttpRequest req) { Map<String,String> p = oauthParams.clone(); p.remove('realm'); // Do not put the realm in the Base String String host = req.getEndpoint(); Integer n = host.indexOf('?'); if(n>-1) { p.putAll(getUrlParams(host.substring(n+1))); host = host.substring(0,n); } List<String> keys = new List<String>(); keys.addAll(p.keySet()); keys.sort(); String s = keys.get(0)+'='+p.get(keys.get(0)); for(Integer i=1;i<keys.size();i++) { s = s + '&' + keys.get(i)+'='+p.get(keys.get(i)); } return req.getMethod().toUpperCase()+ '&' + EncodingUtil.urlEncode(host, 'UTF-8') + '&' + EncodingUtil.urlEncode(s, 'UTF-8'); } public void sign(HttpRequest req) { nonce = String.valueOf(Crypto.getRandomLong()); timestamp = String.valueOf(DateTime.now().getTime()/1000); refreshParameters(); String s = createBaseString(parameters, req); Blob sig = Crypto.generateMac('hmacSHA256', Blob.valueOf(s), Blob.valueOf(consumerSecret+'&'+tokenSecret)); signature = EncodingUtil.urlEncode(EncodingUtil.base64encode(sig), 'UTF-8'); String header = 'OAuth '; for (String key : parameters.keySet()) { header = header + key + '="'+parameters.get(key)+'",'; } header = header + 'oauth_signature="'+signature+'"'; req.setHeader('Authorization',header); } } |