netsuite是否有REST-ful API?
我想知道Netsuite是否提供REST-ful api?目前,我正在使用基于soap的web服务与我的应用程序(java)进行集成。我做了一些研究,但没有得到有用的信息。如果有,我在哪里可以找到api?在NetSuite中,您可以构建提供基于REST的接口的RESTlet脚本。基本上,您可以使用它们构建自己的JSON API。建议在NetSuite帮助中搜索RESTlet。是。这在自定义/部分中。您将在那里找到“RestLet”。博士是 不管你说你的应用程序是基于soap的,我建议你看看Netsuite的aka SuiteTalk SuiteTalk平台通过基于XML的应用程序编程接口(API)提供对NetSuite数据和业务流程的编程访问 我认为您确实需要访问Netsuite数据,对吗 你可以下载他们的测试和学习 SOAP更易于配置和使用,但每个端口只允许1个连接 Netsuite帐户(您将登录凭据用作身份验证) 而且速度相对较慢 这并不完全正确,因为您可以使用SuiteCloudPlus程序对其进行扩展。查看以下帮助: -理解Web服务治理 -使用SuiteCloud Plus启用Web服务并发用户netsuite是否有REST-ful API?,netsuite,Netsuite,我想知道Netsuite是否提供REST-ful api?目前,我正在使用基于soap的web服务与我的应用程序(java)进行集成。我做了一些研究,但没有得到有用的信息。如果有,我在哪里可以找到api?在NetSuite中,您可以构建提供基于REST的接口的RESTlet脚本。基本上,您可以使用它们构建自己的JSON API。建议在NetSuite帮助中搜索RESTlet。是。这在自定义/部分中。您将在那里找到“RestLet”。博士是 不管你说你的应用程序是基于soap的,我建议你看看Net
更新:大约自2016年7月以来,NetSuite中有两种治理类型-用户治理(也称为遗留治理模型,在使用会话/SOAP登录方法时隐式使用)和帐户治理。在帐户管理中,所有传入的并发请求都有一个共享池(不应使用会话、通过用户凭据进行身份验证或基于令牌的身份验证)。避免像瘟疫一样使用SuiteTalk SOAP web services API;这只会浪费你的时间。Netsuite SOAP API的使用只有在您认为SOAP API没有性能时才可行,不要介意与存在严重错误的SOAP API交互,有很多时间来实现健壮的错误处理来解释随机SOAP错误、并发错误。开发健壮的容错能力需要很多时间。所有的时间都将被浪费;因为任何时间都不能使SOAP API的性能被接受 在编写数据时,RESTlet优于SOAP API;restlet在写操作方面的性能稍高一些(尽管响应速度仍然非常慢,不适合面向客户的应用程序) RESTlet是一个可行的短期解决方案,用于将数据写入Netsuite。它本质上是一个JS脚本,允许您设置基于令牌的auth poor man的JSON端点;在其中,您可以发送JSON请求主体并返回JSON响应主体。在不需要通过Restlet写入太多数据的情况下(例如SalesOrders),使用是合理的。具有重试功能的基于队列的系统和后台作业将缓解随机Netsuite错误问题(并发错误、超时等) 如果您必须经常向一组Netsuite实体写入数据,并且使用Netsuite作为数据的真实来源,而不是试图在Netsuite之上构建一个完整的REST-like JSON API;我建议实现一个发布/订阅服务,其中Netsuite将事件发布到应用程序/API订阅的外部服务。您的应用程序还可以将突变发布到Netsuite订阅的频道。这样,发送到Netsuite的数据突变可以在一个中间层中发生,并且减少了复杂度 要获取外部应用程序的Netsuite数据,最有效的方法似乎是Netsuite ODBC数据库驱动程序;它提供到Netsuite数据库只读表视图的直接连接。对于在Postgres或MySQL中具有相同模式的一组项目的简单select查询通常需要0.5ms或更短的时间;通常需要15秒到100秒以上的时间才能返回
使用NS ODBC驱动程序时,Netsuite的连接超时和其他错误仍然很常见。尽管查询结果很慢,但在14秒内检索5000个项目所需的所有数据要比通过Netsuite的SOAP API获取相同数据所需的时间要好得多。是的,Netsuite支持REST web服务。 下面是一个使用开源scribe库的Java示例 请注意,Netsuite需要
application/json
的Accept
(对于帖子,需要Content-Type
)头来接受请求,否则您将得到“请求媒体类型无效”错误。此外,还必须为API类(NetSuiteApi.java)实现getSignatureType方法
更改所有字符串常量以适合您的设置。请注意,此代码也将与Netsuite RESTlet一起使用
REST文档可在以下位置获得:
https://[your netsuite ID].app.netsuite.com/help/helpcenter/en_US/PDF/REST_Web_Services.PDF
文件#1:NetSuiteApi.java
package com.scribe.api;
import com.github.scribejava.core.builder.api.DefaultApi10a;
import com.github.scribejava.core.model.OAuth1RequestToken;
public class NetSuiteApi extends DefaultApi10a {
private static class InstanceHolder {
private static final NetSuiteApi INSTANCE = new NetSuiteApi();
}
public static NetSuiteApi instance() {
return InstanceHolder.INSTANCE;
}
@Override
public String getAccessTokenEndpoint() {
return null;
}
@Override
public String getRequestTokenEndpoint() {
return null;
}
@Override
public String getAuthorizationUrl(OAuth1RequestToken requestToken) {
return null;
}
@Override
protected String getAuthorizationBaseUrl() {
return null;
}
@Override
public OAuth1SignatureType getSignatureType() {
return OAuth1SignatureType.HEADER;
}
}
package com.scribe.api;
import com.github.scribejava.core.builder.ServiceBuilder;
import com.github.scribejava.core.model.OAuth1AccessToken;
import com.github.scribejava.core.model.OAuthRequest;
import com.github.scribejava.core.model.Response;
import com.github.scribejava.core.model.Verb;
import com.github.scribejava.core.oauth.OAuth10aService;
public final class NetSuiteRestExample {
private String CONSUMER_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
private String CONSUMER_SECRET = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy";
private String TOKEN_ID = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
private String TOKEN_SECRET = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
private String REST_URL = "https://1234567-sb1.suitetalk.api.netsuite.com/rest/platform/v1/record/inventoryitem/";
private String REALM = "1234567_SB1";
private String POSTBODY = "{\"type\": \"SIMPLE\",\"authorId\": -5}";
public static void main(String[] args) {
final OAuth10aService service = new ServiceBuilder(CONSUMER_KEY).apiSecret(CONSUMER_SECRET))
.build(NetSuiteApi.instance());
OAuth1AccessToken accessToken = new OAuth1AccessToken(TOKEN_ID, TOKEN_SECRET);
// This is POST method call
// OAuthRequest request = new OAuthRequest(Verb.POST, REST_URL);
// request.addHeader("Content-Type", "application/json");
// // Without next line, you'll get a "Request media type is not valid." error, even though this is not needed with Postman
// request.addHeader("Accept", "application/json");
// request.setRealm(REALM);
// request.setPayload(POSTBODY);
// This is GET method call
OAuthRequest request = new OAuthRequest(Verb.GET, params.get("REST_URL"));
// Without next line, you'll get a "Request media type is not valid." error, even though this is not needed with Postman
request.addHeader("Accept", "application/json");
request.setRealm(params.get("REALM"));
service.signRequest(accessToken, request);
System.out.println("Sending this request...");
System.out.println(request.getHeaders());
System.out.println(request.getCompleteUrl());
// System.out.println(request.getPayload());
final Response response = service.execute(request);
System.out.println("Got this response...");
System.out.println(response.getCode() + "\n" + response.getHeaders());
System.out.println(response.getBody());
return response.getBody();
}
}
文件#2:netsuiteAppallexample.java
package com.scribe.api;
import com.github.scribejava.core.builder.api.DefaultApi10a;
import com.github.scribejava.core.model.OAuth1RequestToken;
public class NetSuiteApi extends DefaultApi10a {
private static class InstanceHolder {
private static final NetSuiteApi INSTANCE = new NetSuiteApi();
}
public static NetSuiteApi instance() {
return InstanceHolder.INSTANCE;
}
@Override
public String getAccessTokenEndpoint() {
return null;
}
@Override
public String getRequestTokenEndpoint() {
return null;
}
@Override
public String getAuthorizationUrl(OAuth1RequestToken requestToken) {
return null;
}
@Override
protected String getAuthorizationBaseUrl() {
return null;
}
@Override
public OAuth1SignatureType getSignatureType() {
return OAuth1SignatureType.HEADER;
}
}
package com.scribe.api;
import com.github.scribejava.core.builder.ServiceBuilder;
import com.github.scribejava.core.model.OAuth1AccessToken;
import com.github.scribejava.core.model.OAuthRequest;
import com.github.scribejava.core.model.Response;
import com.github.scribejava.core.model.Verb;
import com.github.scribejava.core.oauth.OAuth10aService;
public final class NetSuiteRestExample {
private String CONSUMER_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
private String CONSUMER_SECRET = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy";
private String TOKEN_ID = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
private String TOKEN_SECRET = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
private String REST_URL = "https://1234567-sb1.suitetalk.api.netsuite.com/rest/platform/v1/record/inventoryitem/";
private String REALM = "1234567_SB1";
private String POSTBODY = "{\"type\": \"SIMPLE\",\"authorId\": -5}";
public static void main(String[] args) {
final OAuth10aService service = new ServiceBuilder(CONSUMER_KEY).apiSecret(CONSUMER_SECRET))
.build(NetSuiteApi.instance());
OAuth1AccessToken accessToken = new OAuth1AccessToken(TOKEN_ID, TOKEN_SECRET);
// This is POST method call
// OAuthRequest request = new OAuthRequest(Verb.POST, REST_URL);
// request.addHeader("Content-Type", "application/json");
// // Without next line, you'll get a "Request media type is not valid." error, even though this is not needed with Postman
// request.addHeader("Accept", "application/json");
// request.setRealm(REALM);
// request.setPayload(POSTBODY);
// This is GET method call
OAuthRequest request = new OAuthRequest(Verb.GET, params.get("REST_URL"));
// Without next line, you'll get a "Request media type is not valid." error, even though this is not needed with Postman
request.addHeader("Accept", "application/json");
request.setRealm(params.get("REALM"));
service.signRequest(accessToken, request);
System.out.println("Sending this request...");
System.out.println(request.getHeaders());
System.out.println(request.getCompleteUrl());
// System.out.println(request.getPayload());
final Response response = service.execute(request);
System.out.println("Got this response...");
System.out.println(response.getCode() + "\n" + response.getHeaders());
System.out.println(response.getBody());
return response.getBody();
}
}
将此添加到Maven依赖项(pom.xml):
...
<dependencies>
...
<dependency>
<groupId>com.github.scribejava</groupId>
<artifactId>scribejava-apis</artifactId>
<version>6.9.0</version>
</dependency>
</dependencies>
。。。
...
com.github.java
ScribeJavaAPI
6.9.0
这是NetSuite为集成目的提供的正确REST API
RESTAPI可以通过基于令牌的身份验证或启用OAuth 2.0的HTTP客户端调用。
首先,您需要登录到NetSuite帐户并启用帐户的SuiteTalk Webservice功能(设置->公司->启用功能)。
然后获取SuiteTalk基本URL,其中包含公司URL(设置->公司->公司信息)下的帐户ID。例如,https://包含启用功能和获取令牌的过程
然后使用BaseUrl+API资源路径作为HTTP客户端路径来调用每个记录API。诸如CRUD、搜索和筛选等操作可以通过这个RESTAPI完成。有关更多信息,请参见作为预防措施,这里有几个p