netsuite有RESTful API吗?

时间:2014-10-06 10:42:34

标签: netsuite

我想知道Netsuite是否提供REST ful api?目前我正在使用基于肥皂的Web服务与我的应用程序(java)进行集成。我已经做了一些研究,但没有获得有用的信息。如果我能在哪里找到api?

6 个答案:

答案 0 :(得分:5)

是。这是在Customization / Scripts部分。你会发现" RestLet"那里。 Doc是here

但是你说你的应用程序是基于soap的,我建议你看看Netsuite的WebServices又称SuiteTalk。

  

SuiteTalk平台通过基于XML的应用程序编程接口(API)提供对NetSuite数据和业务流程的编程访问。

我认为您确实需要访问您的Netsuite数据,对吗?

您可以下载sample进行测试和学习。

答案 1 :(得分:2)

在NetSuite中,您可以构建RESTlet脚本,以提供基于REST的界面。您基本上可以使用它们来构建自己的JSON API。建议在NetSuite帮助中研究RESTlet。

答案 2 :(得分:2)

这是NetSuite提供的用于集成目的的正确REST API。

https://system.netsuite.com/help/helpcenter/en_US/APIs/REST_API_Browser/record/v1/2020.1/index.html

可以通过基于令牌的身份验证或启用OAuth 2.0的HTTP客户端调用REST API。 首先,您需要登录到NetSuite帐户并启用该帐户的SuiteTalk Web服务功能(设置->公司->启用功能)。 然后获取SuiteTalk基本URL,该URL包含公司URL下的帐户ID(设置->公司->公司信息)。例如,https:// .suitetalk.api.netsuite.com 之后,创建一个集成应用程序(“设置”->“集成”->“新建”),启用OAuth 2.0或TBA。 blog包含启用功能和获取令牌的过程。

然后使用BaseUrl + API资源路径作为HTTP客户端路径来调用每个记录API。可以通过此REST API完成CRUD,搜索和过滤器之类的操作。有关更多信息,请参见NetSuite Documentation

答案 3 :(得分:1)

  

SOAP更易于配置和使用,但每个只允许1个连接   Netsuite帐户(您使用登录凭据作为身份验证)   并且相对较慢。

这不太正确,因为您可以使用套件云加上程序来扩展它。检查帮助: - 了解Web服务治理 - 使用SuiteCloud Plus启用Web服务并发用户

答案 4 :(得分:1)

不惜一切代价避免使用SuiteTalk SOAP Web服务API;它只不过是浪费时间而已,您会发现这不是一个可行的选择。如果可以的话,可以使用Netsuite SOAP API,如果您认为SOAP API的性能不佳,不介意与总体交互以使用有问题的SOAP API,有足够的时间来实现对随机SOAP错误,并发错误的强大错误处理,以及还愿意开发强大的容错能力并完全忽略SOAP API性能问题(它根本无法在合理的时间内获取数据,甚至对于每日或定期导入也不可行)。

与SOAP API相比,RESTlet在写入数据方面更受青睐; RESTlet的写入性能往往更高(尽管响应仍然非常慢,并且不适合面向客户的应用程序。)

RESTlet是将数据写入Netsuite的可行的短期解决方案,它使您可以使用类似于真实Rest API的JSON请求正文和响应正文。在不需要通过Restlet写入大量数据的情况下,使用特别可行。具有失败请求重试容错能力的基于队列的系统和后台作业效果很好。

如果您必须经常写一堆Netsuite实体,并且正在使用Netsuite作为数据的真实来源,而不是尝试在Netsuite之上构建像JSON API这样的整个REST;我建议实现一个发布/订阅服务,其中Netsuite将事件发布到您的应用程序/ API所订阅的外部服务中;然后您的应用还会将变体发布到Netsuite所订阅服务中的某个频道。这样,发送到Netsuite的数据突变可以在中间层发生,从而降低了复杂性。同样,您的应用会利用订阅的事件来同步数据。

要检索外部应用程序的Netsuite数据,最有效的方法似乎是通过Netsuite ODBC数据库驱动程序;它提供与Netsuite数据库只读表视图的直接连接。简单选择查询一组在Postgres或MySQL中具有相同架构的项目通常需要0.5毫秒或更短的时间;通常需要15秒钟到100秒钟以上才能返回。 Netsuite的连接超时和其他错误很常见。但是,检索少量行可能需要15秒到100秒以上的时间。尽管如此,在14秒内检索一组5000个项目所需的所有数据将花费Netsuite的SOAP API小时。

答案 5 :(得分:1)

是的,Netsuite支持REST Web服务。 这是一个有效的Java示例,它使用了开源的抄写器库。

请注意,Netsuite需要Accept的{​​{1}}(对于帖子来说,Content-Type)标头才能使Netsuite接受请求,否则您将获得“请求媒体类型为无效。”错误。此外,必须为API类(NetSuiteApi.java)实现getSignatureType方法。

更改所有字符串常量以适合您的设置。请注意,此代码还将与Netsuite RESTlet一起使用。

REST文档在这里可用: https:// [your-netsuite-ID] .app.netsuite.com / help / helpcenter / zh_CN / PDF / REST_Web_Services.pdf

文件#1:NetSuiteApi.java

application/json

文件#2:NetSuiteApiCallExample.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;
}

}

将其添加到您的Maven依赖项(pom.xml):

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();
    }
}