Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
netsuite是否有REST-ful API?_Netsuite - Fatal编程技术网

netsuite是否有REST-ful API?

netsuite是否有REST-ful API?,netsuite,Netsuite,我想知道Netsuite是否提供REST-ful api?目前,我正在使用基于soap的web服务与我的应用程序(java)进行集成。我做了一些研究,但没有得到有用的信息。如果有,我在哪里可以找到api?在NetSuite中,您可以构建提供基于REST的接口的RESTlet脚本。基本上,您可以使用它们构建自己的JSON API。建议在NetSuite帮助中搜索RESTlet。是。这在自定义/部分中。您将在那里找到“RestLet”。博士是 不管你说你的应用程序是基于soap的,我建议你看看Net

我想知道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服务并发用户


更新:大约自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