kintone Java SDK(不推荐使用)

aki发表于:2019年09月13日 09:35:12更新于:2021年05月13日 14:29:18

目前不推荐使用此工具,请使用新发布的 kintone Java Client

Index

概要

本篇介绍于2018年12月发布的“kintone Java SDK”。
有了本次发布的“kintone Java SDK”,使用Java进行批处理或开发手机应用程序时,可以更加简单方便地执行REST API。
※与之前发布的“kintone API SDK(β) for Java”不同的是,这是新的库。

另外,“kintone Java SDK”和以前发布的“kintone Node.js SDK”及与本次同时期发布的“kintone iOS SDK”的设计思路类似。
因此,虽然存在着开发语言的差异,但验证及连接、类、方法等各个地方的声明都一样。

GitHub

https://github.com/kintone-labs/kintone-java-sdk

文档

https://kintone-labs.github.io/kintone-java-sdk/latest/

本次通过举例说明kintone Java SDK的导入方法及执行。
在Eclipse上进行开发。请在可执行的环境下尝试。

Eclipse

http://mergedoc.osdn.jp/

注意事项

  • 根据许可协议,可对代码进行更改、再发布以及用于商业目的。

导入方法

安装

“kintone Java SDK”使用Apache maven进行库安装。另外,在eclipse下使用maven时,使用了M2Eclipse这个插件。

Apache maven以及M2Eclipse的安装,请参考其官网。
https://maven.apache.org/index.html

https://www.eclipse.org/m2e/

maven和M2Eclipse安装完成后,请按照以下步骤,做成maven项目,导入kintone Java SDK。

1.在~\apache-maven-3.6.2\conf目录下的“setting.xml”里添加以下内容

    //设置本地仓库    
<localRepository>C:/apache-maven-3.6.2/repository\</localRepository>

2.用Eclipse创建Maven项目

 - 选择Eclipse的【File > New > Maven Project】

- 在Group Id中输入任意值,Artifact Id中输入“Sample_project”,其他默认值,点击完成按钮

0015d7b093512ea4320be5101b82655

 - 在任意的包内创建主类“SampleMain.java”

3.导入setting.xml

- 点击Eclipse的“Window > Preferences”,选择“Maven > User Settings”

- 在“User Settings”中选择步骤1中设置的“setting.xml”,点击“Apply and Close”

0015d7b09b9cc6602a6ebe02f094e26

4.编辑步骤2中创建的项目内的pom.xml

 - 在pom.xml的<dependencies>标签内添加以下内容

※1.groupId、artifactId的值固定

※2.version的值预定在每次升级时进行适当的更改。

<dependency>    
<groupId>com.cybozu.kintone</groupId>    
<artifactId>kintone-sdk</artifactId>    
<version>0.2.0</version>    
</dependency>

5.右击在步骤2中创建的项目,选择“ Run As > Maven install”

6.右击步骤2中创建的项目,选择“ Maven > Update Project”

范例

例举文档中Quickstart的简单范例代码,对执行方法和应答进行说明。
在范例代码的功能是从kintone应用中获取一条记录。
准备阶段是创建kintone应用,根据下表添加字段,生成API令牌(必要的访问权限=查看)。

字段类型字段代码
单行文本框text

范例代码(文件名:SampleMain.java)

复制以下范例代码,替换“sample_project”内的“SampleMain.java”。
API令牌、验证信息、子域名、应用ID等请根据自身的环境做适当的更改。

package main;

import java.util.HashMap;

import com.cybozu.kintone.client.authentication.Auth;    
import com.cybozu.kintone.client.connection.Connection;    
import com.cybozu.kintone.client.exception.KintoneAPIException;    
import com.cybozu.kintone.client.model.record.GetRecordResponse;    
import com.cybozu.kintone.client.model.record.field.FieldValue;    
import com.cybozu.kintone.client.module.record.Record;

public class SampleMain {

    public static void main(String[] param) {
    
        System.out.println("test start");
        
        final String API_TOKEN = "api_token";
        
        // Init authentication module    
        Auth kintoneAuth = new Auth();    
        kintoneAuth.setApiToken(API_TOKEN);
        
        // Init Connection without "guest space ID"    
        final String DOMAIN =  "{yourdomain}.cybozu.cn";    
        Connection kintoneConnection = new Connection(DOMAIN, kintoneAuth);
        
        // Init Record Module    
        Record kintoneRecord = new Record(kintoneConnection);
        
        // execute get record API    
        final Integer APP_ID = 00;    
        final Integer RECORD_ID = 0;    
        try {    
            GetRecordResponse responese = kintoneRecord.getRecord(APP_ID, RECORD_ID);    
            HashMap<String, FieldValue> record =  responese.getRecord();    
            System.out.println("record ID :" + record.get("$id").getValue());    
            System.out.println("text field :" + record.get("text").getValue());    
            System.out.println("test end");    
        } catch (KintoneAPIException e) {    
            e.printStackTrace();    
            System.err.println(e.getErrorResponse().getMessage());    
        }    
    }    
}

执行

右击Eclipse上编写的代码,选择“Debug>2 Java Application”。

应答的范例

应答成功时,会返回如下应答。

0015d803e4b298bd750eba56bca3d07

范例代码解说

Authentication

以下解说范例代码第18~23行。
这部分是为了连接kintone的验证方法。

// Init authentication module    
Auth kintoneAuth = new Auth();

使用Authentication类设置密码验证、API令牌验证、Basic验证。

验证的优先顺序如下。(参考:kintone REST API共通规格
1.密码验证
2.API令牌验证
※kintone Java SDK不支持会话验证。

密码验证

final String USERNAME = "username";    
final String PASSWORD = "password";    
kintoneAuth.setPasswordAuth(USERNAME, PASSWORD);

API令牌验证

final String API_TOKEN = "api_token";    
kintoneAuth.setApiToken(API_TOKEN);

Basic验证

final String BASIC_USERNAME = "basic_username";    
final String BASIC_PASSWORD = "basic_password";    
kintoneAuth.setBasicAuth(BASIC_USERNAME, BASIC_PASSWORD);

Connection

第25~27行的Connection类用于设置连接。
使用连接目标域名信息以及刚才完成的验证信息连接到kintone环境。

// Init Connection without "guest space ID"    
final String DOMAIN =  "{yourdomain}.cybozu.cn";    
Connection kintoneConnection = new Connection(DOMAIN, kintoneAuth);

// for guest space    
final String DOMAIN =  "{yourdomain}.cybozu.cn";    
final int GUEST_SPACE_ID = 0;    
Connection kintoneConnection = new Connection(DOMAIN, kintoneAuth, GUEST_SPACE_ID);

Record

最后是第32~44行。

// execute get record API
final Integer APP_ID = 00;
final Integer RECORD_ID = 0;
try {
    GetRecordResponse responese = kintoneRecord.getRecord(APP_ID, RECORD_ID);
    HashMaprecord =  responese.getRecord();
    System.out.println("record ID :" + record.get("$id").getValue());
    System.out.println("text field :" + record.get("text").getValue());
    System.out.println("test end");
} catch (KintoneAPIException e) {
    e.printStackTrace();
    System.err.println(e.getErrorResponse().getMessage());
}

这部分实际是执行kintone的REST API的处理。

范例中,使用Record类的getRecord函数获取1条记录。

getRecord(appID, recordID)

参数

名称数据类型必须说明
appIDInteger应用ID
recordIDInteger记录编号

Record类里,如下文所述,除了获取1条记录外,还有其他各种各样的函数。

关于其他功能

Record类

此类中定义了如刚才范例代码中用到的函数等。
其定义的函数包含对应用的记录进行获取、添加、更新、删除、更改状态等类,以及对回复进行获取、填写、删除等函数。
以下是其所包含的类的部分例子。

  • getRecord

  • getRecords

  • addRecord

  • addRecords

  • updateRecords

  • deleteRecords

  • updateRecordStatus

  • getComments

  • addComment

  • deleteComment

其他还有各种各样的函数。详情请参考文档。

关于Record类

https://kintone-labs.github.io/kintone-java-sdk/latest/reference/record/

关于BulkRequest类

可对多个应用同时发起多个API请求。
BulkRequest中可使用的函数请参考以下文档。

关于BulkRequest类

https://kintone-labs.github.io/kintone-java-sdk/latest/reference/bulk-request/

另外,执行BulkRequest时需要注意以下内容。

  • 执行BulkRequest并获取应答时,执行execute函数。

  • 除了excecute函数外,一次最多只能执行20个函数。

BulkRequest范例

BulkRequest bulkRequest = new BulkRequest(kintoneConnection);

try {
    bulkRequest.addRecord(APP_ID, addData);
    bulkRequest.addRecords(APP_ID, addDataList);
    bulkRequest.updateRecordByID(APP_ID, updateRecID, updateData, null);
    bulkRequest.deleteRecords(APP_ID, delIdList);

    BulkRequestResponse responses = bulkRequest.execute();
    System.out.println(responses.getResults());
} catch (KintoneAPIException e) {
    e.printStackTrace();
    System.err.println(e.getErrorResponse().getMessage());
}

App类

此类定义了用于获取应用信息的函数。
需要有应用的查看权限。
关于其包含的函数,请参考以下文档。

关于App类

https://kintone-labs.github.io/kintone-java-sdk/latest/reference/app/

App范例

App app = new App(kintoneConnection);

try {
    AppModel response = app.getApp(APP_ID);
    System.out.println(response.getCreator().getName());
} catch (KintoneAPIException e) {
    e.printStackTrace();
    System.err.println(e.getErrorResponse().getMessage());
}

关于类型

kintone Java SDK中,各API的应答分别使用了独自的类型。
各自的构造函数以及可以使用的方法都不一样,使用前请认真阅读文档。

https://kintone-labs.github.io/kintone-java-sdk/latest/reference/model/app/app/app-model/

最后

在使用Java进行批处理以及手机应用的开发时,可以更加方便地执行kintone REST API了。
希望您能借此机会好好利用kintone Java SDK。

本Tips在2019年2月版 kintone中确认过。


回复(8)

  • cybozu

    嗯 

    不过我觉得这个定时执行的请求应该不是一样的吧,不然不太可能报的错不一样。然后也希望从报错提示431展开更多的调查。

    还有两个限制也请注意。

    kintone本身有2个限制

    1.同时可访问请求是100个。

    2.1个domain一天最多10000条

    引用 充满愤怒的人生你快乐吗 的回复:

    我们使用的是getApp方法,method GET是在SDK中指定的,设定了job每5分钟执行一次,从上午9点开始执行,一般是在下午4,5点的时候出现上述431错误,当设定5秒钟执行一次大概1个小时出现问题,执行次数是400次左右,日志中输出的发送数据都是固定的没有变化,我们也没有设定任何header数据。您说的Content-Type我们也没有指定用的默认的,查看了kintone sdk源码默认是在Connection.class中 93行:connection.setRequestProperty("Content-Type", "application/json"); 这个问题我们也觉得很奇怪,希望能得到您的帮助,谢谢!

  • 充满愤怒的人生你快乐吗

    我们使用的是getApp方法,method GET是在SDK中指定的,设定了job每5分钟执行一次,

    从上午9点开始执行,一般是在下午4,5点的时候出现上述431错误,
    当设定5秒钟执行一次大概1个小时出现问题,执行次数是400次左右,
    日志中输出的发送数据都是固定的没有变化,我们也没有设定任何header数据。

    您说的Content-Type我们也没有指定用的默认的,

    查看了kintone sdk源码默认是在Connection.class中 93行:

    connection.setRequestProperty("Content-Type", "application/json"); 


    这个问题我们也觉得很奇怪,希望能得到您的帮助,谢谢!

    引用 cybozu 的回复:

    发送的header里的Content-Type是自己指定的把,是不是发送的payload并不是json,数据本身有问题呢。请求头部过长是不是可能调用了某个get请求的api,然后把一些没必要的数据放到了请求里。

  • cybozu

    发送的header里的Content-Type是自己指定的把,是不是发送的payload并不是json,数据本身有问题呢。请求头部过长是不是可能调用了某个get请求的api,然后把一些没必要的数据放到了请求里。

    引用 充满愤怒的人生你快乐吗 的回复:

    我们使用SDK制作了一个数据备份的服务,在进行测试的时候,发现当发送的请求达到一定的数量之后,发送的request header的内容发生了变化,【Content-Type】从【application/json;charset=utf-8】变成了【text/html;charset=iso-8859-1】导致服务器在接收到请求后,直接返回431的错误(431 - 请求头部字段太大)只要请求发送数量达到一定数量,必然没重复发生同样的问题。把服务重启后,再次执行一样的操作又能正常运行,但请求达到一定数量后,又会重复发生一样的问题。是kintone服务器对于外部请求有数量限制还是SDK本身有什么问题?

  • 充满愤怒的人生你快乐吗

    我们使用SDK制作了一个数据备份的服务,在进行测试的时候,
    发现当发送的请求达到一定的数量之后,发送的request header的内容发生了变化,
    【Content-Type】从【application/json;charset=utf-8】变成了【text/html;charset=iso-8859-1】
    导致服务器在接收到请求后,直接返回431的错误(431 - 请求头部字段太大)
    只要请求发送数量达到一定数量,必然没重复发生同样的问题。
    把服务重启后,再次执行一样的操作又能正常运行,但请求达到一定数量后,又会重复发生一样的问题。
    是kintone服务器对于外部请求有数量限制还是SDK本身有什么问题?

  • betsy_yan

    Delete Records只能删除整条数据,无法做到对一条数据中的某一个内容进行删除。

    如果只想对某一个内容删除的话你可以试试更新数据。更新时可以把你想要删除的那个值置空就可以了。

    你可以参考以下链接:

    更新记录(PUT)

    https://cybozudev.kf5.com/hc/kb/article/201605/

    获取发生了更改的字段及表格内的行对象

    https://cybozudev.kf5.com/hc/kb/article/206917/#step11

    更新记录时的表格操作技巧

    https://cybozudev.kf5.com/hc/kb/article/211417/#

    引用 咖喱辣椒℡ 的回复:

    你好,再次的麻烦到你,想跟你确认一下关于kintone API:Delete Records是删除kintone画面指定数据的API方法,请问一下这个API能否删除指定数据下明细行(SUBTABLE)的数据呢?

  • 咖喱辣椒℡

    你好,再次的麻烦到你,想跟你确认一下关于kintone API:Delete Records
    是删除kintone画面指定数据的API方法,请问一下这个API能否删除指定数据下明细行(SUBTABLE)的数据呢?

  • cybozu

    嗯,我们已经注意到了这个问题,但是我们会在近期更新另一个新版本的java sdk。你可以自行修改这个sdk或者等待新版。

    引用 咖喱辣椒℡ 的回复:

    你好,在使用最新JAVA api 0.6.0版本时发现,如果kintone画面上有CALC时会报空指针异常public FormFields getFormFields(Integer appId, LanguageSetting lang, Boolean isPreview) throws KintoneAPIException原因是:FormFieldParser文件中方法,没有CALC类型:private AbstractInputField parseInputField(JsonElement input) throws KintoneAPIException麻烦帮忙看下,谢谢

  • 咖喱辣椒℡

    你好,在使用最新JAVA api 0.6.0版本时发现,如果kintone画面上有CALC时会报空指针异常

    public FormFields getFormFields(Integer appId, LanguageSetting lang, Boolean isPreview) throws KintoneAPIException

    原因是:

    FormFieldParser文件中方法,没有CALC类型:
    private AbstractInputField parseInputField(JsonElement input) throws KintoneAPIException

    麻烦帮忙看下,谢谢