添加START_WITH过滤器后NetSuite RestAPI签名无效致401未授权问题
NetSuite REST API带START_WITH过滤器请求返回401无效签名问题
我在创建带START_WITH过滤器的NetSuite REST API请求获取记录详情时,每次都被拒绝,返回错误401 Unauthorized. Invalid Signature;但不添加过滤器的普通请求能正常返回正确响应。
我的签名生成代码如下:
public String generateOauthHeader( String method, UserFields userFields, String baseUrl, String offset, String limit) { long timestamp = new Date().getTime() / 1000; String nonce = getAlphaNumericString(); ArrayList<String> parameters = new ArrayList<>(); parameters.add( ApplicationConstants.CONSUMER_KEY + ApplicationConstants.EQUAL + userFields.getConsumerKey()); parameters.add(ApplicationConstants.NONCE + ApplicationConstants.EQUAL + nonce); parameters.add( ApplicationConstants.SIGNATURE_METHOD_KEY + ApplicationConstants.EQUAL + ApplicationConstants.SIGNATURE_METHOD_VAL); parameters.add(ApplicationConstants.TIMESTAMP + ApplicationConstants.EQUAL + timestamp); parameters.add( ApplicationConstants.OAUTH_TOKEN + ApplicationConstants.EQUAL + userFields.getTokenId()); parameters.add( ApplicationConstants.VERSION_KEY + ApplicationConstants.EQUAL + ApplicationConstants.VERSION_VAL); if (offset != null) { parameters.add(ApplicationConstants.OFFSET + ApplicationConstants.EQUAL + offset); } if (limit != null) { parameters.add(ApplicationConstants.LIMIT_CLAUSE + ApplicationConstants.EQUAL + limit); } parameters.add("q" + ApplicationConstants.EQUAL + "companyname START_WITH COMP1234"); Collections.sort(parameters); StringBuffer parametersList = new StringBuffer(); for (int i = 0; i < parameters.size(); i++) { parametersList.append(((i > 0) ? ApplicationConstants.AMPERSAND : "") + parameters.get(i)); } String signature = null; try { String signatureString = method + ApplicationConstants.AMPERSAND + URLEncoder.encode(baseUrl, StandardCharsets.UTF_8) + ApplicationConstants.AMPERSAND + URLEncoder.encode(parametersList.toString(), StandardCharsets.UTF_8); SecretKeySpec signingKey = new SecretKeySpec( (userFields.getConsumerSecret() + ApplicationConstants.AMPERSAND + userFields.getTokenSecret()) .getBytes(), ApplicationConstants.HMACSHA256); Mac m = Mac.getInstance(ApplicationConstants.HMACSHA256); m.init(signingKey); m.update(signatureString.getBytes()); byte[] res = m.doFinal(); signature = Base64Coder.encodeLines(res); } catch (Exception e) { e.printStackTrace(); } return ApplicationConstants.OAUTH + ApplicationConstants.REALM + ApplicationConstants.EQUAL_START_QUOTES + userFields.getAccountId() + ApplicationConstants.END_QUOTES + ApplicationConstants.CONSUMER_KEY + ApplicationConstants.EQUAL_START_QUOTES + userFields.getConsumerKey() + ApplicationConstants.END_QUOTES + ApplicationConstants.OAUTH_TOKEN + ApplicationConstants.EQUAL_START_QUOTES + userFields.getTokenId() + ApplicationConstants.END_QUOTES + ApplicationConstants.SIGNATURE_METHOD_KEY + ApplicationConstants.EQUAL_START_QUOTES + ApplicationConstants.SIGNATURE_METHOD_VAL + ApplicationConstants.END_QUOTES + ApplicationConstants.TIMESTAMP + ApplicationConstants.EQUAL_START_QUOTES + timestamp + ApplicationConstants.END_QUOTES + ApplicationConstants.NONCE + ApplicationConstants.EQUAL_START_QUOTES + nonce + ApplicationConstants.END_QUOTES + ApplicationConstants.VERSION_KEY + ApplicationConstants.EQUAL_START_QUOTES + ApplicationConstants.VERSION_VAL + ApplicationConstants.END_QUOTES + ApplicationConstants.SIGNATURE + ApplicationConstants.EQUAL_START_QUOTES + URLEncoder.encode(signature, StandardCharsets.UTF_8) + ApplicationConstants.QUOTES; }
请求URL示例:
- 无过滤器:
https://1212112-sb1.suitetalk.api.netsuite.com/services/rest/record/v1/customer/ - 带过滤器:
https://1212112-sb1.suitetalk.api.netsuite.com/services/rest/record/v1/customer?q="companyName START_WITH COMP1234"
内容的提问来源于stack exchange,提问作者Shubham Kumar
相关产品推荐
相关产品推荐

