responsysinteractiverestapi的python客户端库

responsysrest的Python项目详细描述


responsys交互rest api python客户端

提供对responsysinteractiveapi的访问的python库。目前支持版本1.3版本6.33 e65150-15。

由于这是alpha软件,许多功能仍有待实现。以下是基于responseys文档名(而不是内部函数名)及其实现状态的每个功能的列表:

<表><广告>功能 实现 注释< /广告><正文>使用用户名和证书登录缺少检索帐户的所有配置文件列表完成合并或更新配置文件列表中的成员部分虽然可以覆盖合并规则,但它们将全局应用于合并,而不是按记录设置。获取所有EMD电子邮件活动完成获取所有推送活动完成使用riid检索配置文件列表的成员完成基于查询属性检索配置文件列表的成员完成检索配置文件列表的所有配置文件扩展名完成基于riid检索配置文件扩展表的成员完成基于查询属性检索配置文件扩展表的成员完成触发电子邮件完成根据RIID删除配置文件列表收件人完成创建新的补充表完成列出文件夹的内容完成在/contentlibrary/中创建新文件夹 完成在/contentlibrary/中创建文档 完成从/contentlibrary/获取文档 完成更新已在/contentlibrary/中的文档 完成删除/contentlibrary/中的文档 完成可以改进删除/contentlibrary/中的文件夹 完成可以改进创建配置文件扩展表缺少更新配置文件扩展表缺少更新补充表缺少从补充表中获取记录缺少从补充表中删除记录缺少更新列表,然后发送电子邮件缺少更新列表并发送电子邮件缺少更新列表并发送短信缺少发送推送消息缺少触发自定义事件缺少安排活动缺少获取活动的计划ID缺少获取活动的日程安排缺少更新活动日程缺少计划外活动缺少创建媒体文件缺少获取媒体文件缺少更新媒体文件缺少删除媒体文件缺少复制媒体文件缺少为文档中引用的媒体设置图像数据缺少获取文档中引用的媒体的图像数据缺少< / TR>

要求

  1. responsys交互帐户(请参阅操作方法)。
  2. 有效的responsys交互api用户名和密码。
  3. python(请参见如何)
  4. PIP(请参阅操作方法)

如何

注册responses interact,网址为https://www.oracle.com/marketingcloud/products/cross-channel-orchestration/index.html" rel="nofollow">https://www.oracle.com/marketingcloud/products/cross-channel-orchestration/index.html(非免费)。

安装python3和python包索引。

  • OS X:建议以这种方式安装python3:http://docs.python-guide.org/en/latest/starting/install3/os x/" rel="nofollow">http://docs.python-guide.org/en/latest/starting/install3/osx/它应该将python3命名为单独的命令python3

这个软件包是为python3.x开发的,但如果您愿意的话,应该可以在2.7上运行。

安装

在应用程序中使用的标准安装

pip install responsysrest

通过存储库克隆进行开发安装

如果您想帮助开发此软件包:

  1. 克隆此回购协议: git克隆git@github.com
  2. 创建虚拟环境 CD响应rest&;python-m venv venv&;source venv/bin/激活
  3. 在开发模式下通过源程序包安装:
    pip install -e .

用法

  1. 导入responsyrest包
  2. 配置您的交互连接设置和凭据
  3. 实例化客户机
  4. 使用客户机

开始的最快方法是创建一个config.json文件和一个secret.json文件,其中包含您的配置和凭据信息。这个包附带了config.json文件,但是您需要创建自己的secret.json文件。您可以从包子模块配置凭证调用auto函数,它将遍历根目录以查找json文件。

config.json模板:

{
    "pod": "5",
    "api_version": "1.3",
    "api_folder": "___api-generated",
    "api_list": "___api-list",
    "profile_extension_table_alias": "_pet",
    "supplemental_table_alias": "_supp",
    "primary_key_alias": "_primary_key",
    "riid_generator_length": 11,
    "caste_nonstr_to_str": false,
    "local_content_library_folder": "",
    "remote_content_library_folder": "___api-generated-cl",
    "test_campaign_name": "test_api_classic",
    "test_local_content_library_folder": "responsysrest/tests/documents/",
    "test_remote_content_library_folder": "___api-generated-test"
}

secret.json模板:

{
    "user_name": "team_member",
    "password": "1!Aa",
    "email_address": "team_member@company.com"
}

如果它们是运行python的本地服务器:

import responsysrest as r
client = r.Client(r.configuration.auto(), r.credentials.auto())

如果不是,则包可以从json文件导入它们:

config = r.configuration.from_json('path/to/config.json')
creds = r.credentials.from_json('path/to/secret.json')

然后实例化客户端:

client = r.Client(config, creds)
<表><广告>属性值它是什么< /广告><正文> POD 字符串,25Oracle子域服务器组,位于端点URL中API文件夹字符串实例中要存储非内容资产的默认位置API清单字符串要填充到实例中的默认列表配置文件扩展表别名字符串默认情况下,要将什么附加到宠物名中补充表别名字符串默认情况下附加到补充表名的内容主键别名字符串默认情况下附加到主键字段的内容RIID_发电机长度整数内置riid应该有多长,主要用于测试从一个等级到另一个等级布尔如果希望包装器将数据转换为字符串,则为true本地目录库文件夹字符串本地到代码执行的内容库位置远程目录库文件夹字符串实例上内容库的位置。使用内容库根目录是不明智的测试活动名称字符串测试将引发的活动的名称。您现在必须手动设置此设置test_local_content_library_文件夹字符串测试套件文档所在的位置。怀疑如果你想改变它的话。test_remote_content_library_文件夹字符串测试套件远程指向的位置。它应该在运行集成测试时创建和删除,因此不要计划在生产中使用此位置。

客户端函数用法:

通常,库需要每个函数调用的记录列表(如果合适)。要将方法应用于一系列记录,请执行以下操作:

imported_csv_data = [
    ['EMAIL_ADDRESS_', 'COUNTRY_'],
    ['hey@test.com', 'US']
]
fields = imported_csv_data[0]
records = imported_csv_data[1:]
client.some_method(fields, records)

不要这样做:

for record in records:
    client.some_method(fields, [record])

管理配置文件列表

检索帐户的所有配置文件列表
pip install responsysrest
0

返回所有配置文件列表的词典列表:

pip install responsysrest
1

它与文件夹位置和所有字段名捆绑在一起,因此只需检索列表的列表:

pip install responsysrest
2

返回:

pip install responsysrest
3

或列表及其各自的文件夹:

pip install responsysrest
4

返回:

pip install responsysrest
5

更新配置文件列表

这是"在配置文件列表中合并或更新成员"功能。

pip install responsysrest
6

它需要三个位置参数:列表名称字段记录。库不检查输入。如果客户端可以连接到responsys,您将从api得到一个有帮助的错误:

pip install responsysrest
7
pip install responsysrest
8

responsys需要大量上下文信息来将记录合并到现有列表中,因此此库为您选择了默认值。

这些可以用关键字参数更改。下面是所有关键字参数,其中所有默认值都是冗余传入的。您不需要设置这些值,除非您将它们从下面的默认值更改为:

pip install responsysrest
9

请注意,您发送的任何记录都必须在"字段"列表中包含一个字段,该字段的值等于match\u column\u name1值(默认情况下为riid\u)。因此,常见的配置文件列表更新可能如下所示:

    pip install -e .
0

    pip install -e .
1

对于单个记录,您可以传入一个字符串:

    pip install -e .
2

使用riid检索配置文件列表的成员
    pip install -e .
3

返回列表中的完整记录。

基于查询属性检索配置文件列表的成员

    pip install -e .
4

返回所提供记录的记录数据。需要列表名称记录ID。列表名称是要从responsys interact实例中查找记录的名称。记录id是要用来标识记录的特定id。query属性是用于检索记录的id类型。如果未指定,则假定为客户ID。可用选项为:

<表><广告>选项 含义< /广告><正文> rRIID e 电子邮件地址>c/td>客户ID M手机号码

要返回的字段应该是python列表数据对象,如果留空,它将返回所有字段:

    pip install -e .
5

根据riid删除配置文件列表收件人

    pip install -e .
6

从配置文件列表中删除记录。示例:

    pip install -e .
7

管理配置文件扩展表

检索配置文件列表的所有配置文件扩展名

    pip install -e .
8

返回与给定列表关联的配置文件扩展名表(也称为配置文件扩展名、配置文件扩展名列表或pets)。它还与文件夹位置和所有字段名捆绑在一起,因此要仅检索列表列表,或检索包含各自文件夹的列表,请使用:

    pip install -e .
9

创建新的配置文件扩展表

创建新的配置文件扩展表。只需要您希望扩展的列表名称,但这将使用默认的文件夹位置和名称(从您的客户端配置)创建一个空白的配置文件扩展表。

{
    "pod": "5",
    "api_version": "1.3",
    "api_folder": "___api-generated",
    "api_list": "___api-list",
    "profile_extension_table_alias": "_pet",
    "supplemental_table_alias": "_supp",
    "primary_key_alias": "_primary_key",
    "riid_generator_length": 11,
    "caste_nonstr_to_str": false,
    "local_content_library_folder": "",
    "remote_content_library_folder": "___api-generated-cl",
    "test_campaign_name": "test_api_classic",
    "test_local_content_library_folder": "responsysrest/tests/documents/",
    "test_remote_content_library_folder": "___api-generated-test"
}
0

示例:

{
    "pod": "5",
    "api_version": "1.3",
    "api_folder": "___api-generated",
    "api_list": "___api-list",
    "profile_extension_table_alias": "_pet",
    "supplemental_table_alias": "_supp",
    "primary_key_alias": "_primary_key",
    "riid_generator_length": 11,
    "caste_nonstr_to_str": false,
    "local_content_library_folder": "",
    "remote_content_library_folder": "___api-generated-cl",
    "test_campaign_name": "test_api_classic",
    "test_local_content_library_folder": "responsysrest/tests/documents/",
    "test_remote_content_library_folder": "___api-generated-test"
}
1

如果使用了样板配置中的默认值,则会创建一个contacts_list_petprofile extension table extendingcontacts_list在客户端配置指定的uifolder中(默认值为\uuu api-generated),没有记录也没有非默认字段。

您也可以指定要使用的扩展名,但此函数是自定的,只允许您创建以正在扩展的配置文件列表的名称开头的配置文件扩展表。

此示例将创建一个扩展联系人列表的空配置文件扩展表调用联系人列表扩展名

{
    "pod": "5",
    "api_version": "1.3",
    "api_folder": "___api-generated",
    "api_list": "___api-list",
    "profile_extension_table_alias": "_pet",
    "supplemental_table_alias": "_supp",
    "primary_key_alias": "_primary_key",
    "riid_generator_length": 11,
    "caste_nonstr_to_str": false,
    "local_content_library_folder": "",
    "remote_content_library_folder": "___api-generated-cl",
    "test_campaign_name": "test_api_classic",
    "test_local_content_library_folder": "responsysrest/tests/documents/",
    "test_remote_content_library_folder": "___api-generated-test"
}
2

您可以指定要放置它的文件夹以覆盖您的客户端配置:

{
    "pod": "5",
    "api_version": "1.3",
    "api_folder": "___api-generated",
    "api_list": "___api-list",
    "profile_extension_table_alias": "_pet",
    "supplemental_table_alias": "_supp",
    "primary_key_alias": "_primary_key",
    "riid_generator_length": 11,
    "caste_nonstr_to_str": false,
    "local_content_library_folder": "",
    "remote_content_library_folder": "___api-generated-cl",
    "test_campaign_name": "test_api_classic",
    "test_local_content_library_folder": "responsysrest/tests/documents/",
    "test_remote_content_library_folder": "___api-generated-test"
}
3

此外,您还可以将字段作为列表提供:

{
    "pod": "5",
    "api_version": "1.3",
    "api_folder": "___api-generated",
    "api_list": "___api-list",
    "profile_extension_table_alias": "_pet",
    "supplemental_table_alias": "_supp",
    "primary_key_alias": "_primary_key",
    "riid_generator_length": 11,
    "caste_nonstr_to_str": false,
    "local_content_library_folder": "",
    "remote_content_library_folder": "___api-generated-cl",
    "test_campaign_name": "test_api_classic",
    "test_local_content_library_folder": "responsysrest/tests/documents/",
    "test_remote_content_library_folder": "___api-generated-test"
}
4

如果不为每个数据类型指定(responsys interact)数据类型,则默认为str4000。此默认数据类型可以用str500str4000integernumbertimestamp

{
    "pod": "5",
    "api_version": "1.3",
    "api_folder": "___api-generated",
    "api_list": "___api-list",
    "profile_extension_table_alias": "_pet",
    "supplemental_table_alias": "_supp",
    "primary_key_alias": "_primary_key",
    "riid_generator_length": 11,
    "caste_nonstr_to_str": false,
    "local_content_library_folder": "",
    "remote_content_library_folder": "___api-generated-cl",
    "test_campaign_name": "test_api_classic",
    "test_local_content_library_folder": "responsysrest/tests/documents/",
    "test_remote_content_library_folder": "___api-generated-test"
}
5

如果将列表作为列表或元组提供,则还可以指定列表中每个字段的字段类型:

{
    "pod": "5",
    "api_version": "1.3",
    "api_folder": "___api-generated",
    "api_list": "___api-list",
    "profile_extension_table_alias": "_pet",
    "supplemental_table_alias": "_supp",
    "primary_key_alias": "_primary_key",
    "riid_generator_length": 11,
    "caste_nonstr_to_str": false,
    "local_content_library_folder": "",
    "remote_content_library_folder": "___api-generated-cl",
    "test_campaign_name": "test_api_classic",
    "test_local_content_library_folder": "responsysrest/tests/documents/",
    "test_remote_content_library_folder": "___api-generated-test"
}
6

默认字段类型覆盖可以与单独的字段一起提供,而不需要它们自己的字段类型规范:

{
    "pod": "5",
    "api_version": "1.3",
    "api_folder": "___api-generated",
    "api_list": "___api-list",
    "profile_extension_table_alias": "_pet",
    "supplemental_table_alias": "_supp",
    "primary_key_alias": "_primary_key",
    "riid_generator_length": 11,
    "caste_nonstr_to_str": false,
    "local_content_library_folder": "",
    "remote_content_library_folder": "___api-generated-cl",
    "test_campaign_name": "test_api_classic",
    "test_local_content_library_folder": "responsysrest/tests/documents/",
    "test_remote_content_library_folder": "___api-generated-test"
}
7

基于RIID检索配置文件扩展表的成员

如果在配置文件扩展表中,则返回完整记录。

{
    "pod": "5",
    "api_version": "1.3",
    "api_folder": "___api-generated",
    "api_list": "___api-list",
    "profile_extension_table_alias": "_pet",
    "supplemental_table_alias": "_supp",
    "primary_key_alias": "_primary_key",
    "riid_generator_length": 11,
    "caste_nonstr_to_str": false,
    "local_content_library_folder": "",
    "remote_content_library_folder": "___api-generated-cl",
    "test_campaign_name": "test_api_classic",
    "test_local_content_library_folder": "responsysrest/tests/documents/",
    "test_remote_content_library_folder": "___api-generated-test"
}
8

还接受一个可选参数fields如果未指定,则默认为all。示例:

{
    "pod": "5",
    "api_version": "1.3",
    "api_folder": "___api-generated",
    "api_list": "___api-list",
    "profile_extension_table_alias": "_pet",
    "supplemental_table_alias": "_supp",
    "primary_key_alias": "_primary_key",
    "riid_generator_length": 11,
    "caste_nonstr_to_str": false,
    "local_content_library_folder": "",
    "remote_content_library_folder": "___api-generated-cl",
    "test_campaign_name": "test_api_classic",
    "test_local_content_library_folder": "responsysrest/tests/documents/",
    "test_remote_content_library_folder": "___api-generated-test"
}
9

{
    "user_name": "team_member",
    "password": "1!Aa",
    "email_address": "team_member@company.com"
}
0

基于查询属性检索配置文件扩展表的成员

{
    "user_name": "team_member",
    "password": "1!Aa",
    "email_address": "team_member@company.com"
}
1

接受五个参数,但需要list_namepet_namerecord_id。列表名称是要在responsys交互实例中查找记录的名称。记录id是要用来标识记录的特定id。query属性是用于检索记录的id类型。可用选项包括:RIID的r,电子邮件地址的e,客户ID的c,移动电话号码的m。返回python列表数据对象的字段列表中的字段,如果留空则返回所有字段。

示例:

{
    "user_name": "team_member",
    "password": "1!Aa",
    "email_address": "team_member@company.com"
}
2

基于RIID删除配置文件扩展表的成员

根据RIID删除配置文件扩展表的成员(如果存在)。

{
    "user_name": "team_member",
    "password": "1!Aa",
    "email_address": "team_member@company.com"
}
3

管理补充表

创建新的补充表

创建新的补充表。只需要一个表名,但这将使用默认的文件夹位置和名称创建一个空白的补充表。

示例:

{
    "user_name": "team_member",
    "password": "1!Aa",
    "email_address": "team_member@company.com"
}
4

这将在您的客户机配置中命名的文件夹(默认为\uuu api-generated)中创建一个不带记录和非默认字段的联系人列表supp补充表。必须指定一个至少包含一个字段的列表,或者指定一个主键作为responsys内部字段名之一。如果不指定主键,包装器将使用输入列表中的第一个字段,因为api需要主键字段。您还可以指定可选的数据提取密钥。

{
    "user_name": "team_member",
    "password": "1!Aa",
    "email_address": "team_member@company.com"
}
5

{
    "user_name": "team_member",
    "password": "1!Aa",
    "email_address": "team_member@company.com"
}
6

包装器使用默认字段类型写入所有字段,除非指定了其他类型,否则默认字段类型为str500。如果指定了默认类型,它将对所有字段使用该类型。

示例:

{
    "user_name": "team_member",
    "password": "1!Aa",
    "email_address": "team_member@company.com"
}
7

管理活动

获取所有EMD活动
{
    "user_name": "team_member",
    "password": "1!Aa",
    "email_address": "team_member@company.com"
}
8

返回活动及其数据、链接及其数据的字典:

{
    "user_name": "team_member",
    "password": "1!Aa",
    "email_address": "team_member@company.com"
}
9

查看公正活动列表:

import responsysrest as r
client = r.Client(r.configuration.auto(), r.credentials.auto())
0

或活动及其各自文件夹的列表: campaims=client.get_campaims()['campaims'] [(campaign['name',campaign['foldername'])用于活动中的活动]

获取所有推送活动
import responsysrest as r
client = r.Client(r.configuration.auto(), r.credentials.auto())
1 <P>返回推送活动及其相关数据的列表。

管理内容

您会注意到我们使用的文件是.htm。responsy在上载时将.html更改为.htm静默,并将.htm附加到ui中创建的.html文件。建议只使用.htm创建所有文件以符合要求,否则,如果要将文件拉出,可能会导致本地副本中出现重复项。实际上,包装器不允许.html文件(尽管您必须自己重命名它们)。

创建文件夹

在内容库中创建文件夹(/contentlibary/)。

import responsysrest as r
client = r.Client(r.configuration.auto(), r.credentials.auto())
2

在内容库中创建文件夹/contentlibarary/new_folder

如果不指定文件夹,包装器将默认为为客户端配置的api文件夹名。样板文件的默认值是\uuu api-generated

删除文件夹

删除内容库中存在的文件夹(/contentlibary/)。

import responsysrest as r
client = r.Client(r.configuration.auto(), r.credentials.auto())
3

这也会递归地删除文件夹中的所有文件。

创建内容库文档

在内容库中创建文档(/contentlibary/)。如果未指定路径,它将使用您的配置本地和远程路径:

import responsysrest as r
client = r.Client(r.configuration.auto(), r.credentials.auto())
4

您还可以指定本地和/或远程ContentLibrary子文件夹:

import responsysrest as r
client = r.Client(r.configuration.auto(), r.credentials.auto())
5

这将创建(如果您在pod 5上):

import responsysrest as r
client = r.Client(r.configuration.auto(), r.credentials.auto())
6

获取内容库文档

获取内容库文档的文档路径、内容和rest crud链接。如果未指定路径,它将使用您的配置本地和远程路径:

import responsysrest as r
client = r.Client(r.configuration.auto(), r.credentials.auto())
7

您还可以指定本地和/或远程ContentLibrary子文件夹:

import responsysrest as r
client = r.Client(r.configuration.auto(), r.credentials.auto())
5

返回:

import responsysrest as r
client = r.Client(r.configuration.auto(), r.credentials.auto())
9

更新内容库文档

更新/contentlibrary/中的文档(如果它已经存在)。如果没有指定路径,它将使用您的配置本地和远程路径。

config = r.configuration.from_json('path/to/config.json')
creds = r.credentials.from_json('path/to/secret.json')
0

返回:

config = r.configuration.from_json('path/to/config.json')
creds = r.credentials.from_json('path/to/secret.json')
1

您还可以指定本地和/或远程ContentLibrary子文件夹:

config = r.configuration.from_json('path/to/config.json')
creds = r.credentials.from_json('path/to/secret.json')
2

此方法的responseys响应明显省略了内容,必须调用get_document()方法才能获取内容。

删除内容库文档

尝试从/contentlibrary/中删除文档。只采用包含文档文件名的完整路径。路径是interact中文档的路径,而不是本地文件路径:

config = r.configuration.from_json('path/to/config.json')
creds = r.credentials.from_json('path/to/secret.json')
3

与固执己见的create、get和update方法不同,您可以尝试从内容库中删除任何内容,甚至在(内容库)根目录下也是如此。如果您已成功将文件加载到内容库中,则应该可以将其删除。

发送消息

可以通过api和可用的方法发送多种类型的带有响应的消息。目前我们只实现发送电子邮件。

发送电子邮件

此包装器要求对此函数的每次调用都以单个邮件为目标,但允许将任意数量的收件人和任意数量的可选数据与每个收件人一起传递。它只接受电子邮件地址作为ID类型。

config = r.configuration.from_json('path/to/config.json')
creds = r.credentials.from_json('path/to/secret.json')
4

收件人可以是字符串或字符串列表。包装器将接受任何响应,但响应将失败/拒绝无效地址。以下参数对于recipients参数(对于包装器而言)都是有效的,但是第三个示例应该从responsys响应返回一个错误:

config = r.configuration.from_json('path/to/config.json')
creds = r.credentials.from_json('path/to/secret.json')
5

只有收件人存在于目标列表中时,才会发送邮件。必须从Responsys UI中的活动仪表板配置目标列表。如果目标市场活动的目标列表中不存在收件人,则将从列表中该项目的responsys api返回失败响应。

您还可以传递要在活动生成中使用的可选数据,无论它是否用于经典或EMD活动。这是用一个收件人的词典完成的:

config = r.configuration.from_json('path/to/config.json')
creds = r.credentials.from_json('path/to/secret.json')
6

或多个收件人的词典列表:

config = r.configuration.from_json('path/to/config.json')
creds = r.credentials.from_json('path/to/secret.json')
7

收件人列表的长度和可选的数据键/值对必须匹配,否则包装器将返回错误。

请注意,密钥不需要匹配:

config = r.configuration.from_json('path/to/config.json')
creds = r.credentials.from_json('path/to/secret.json')
8

但是要小心,如果收件人没有接收到可选数据,而收件人确实接收到可选数据,则需要传递一个空字典:

config = r.configuration.from_json('path/to/config.json')
creds = r.credentials.from_json('path/to/secret.json')
9

有时可以更容易地传入none或空字符串:

client = r.Client(config, creds)
0

非本地功能

基于任意端点调用,您可能需要对api执行一些困难的操作。包装纸为您提供这片糖果。

获取记录列表
client = r.Client(config, creds)
1

循环遍历每个列表并检查记录是否在列表中。如果记录在列表中,它会将其添加到返回的对象中。这很慢,但有时您想知道成员的列表。

开发/测试

如果您希望做出贡献,那么最好的做法是正确配置客户端(gettests/test_1user_configs.pypassing),然后从以下位置获取缺少的功能列表: python3-m py test rest/tests/test_2client.py

目前已实现25/52个功能。

运行所有测试或仅运行客户端测试将尝试向客户端的凭据电子邮件地址发送测试消息。必须在交互用户界面中手动配置测试消息。它可以是任何内容,其名称在config.json文件中配置:

client = r.Client(config, creds)
2

运行配置和集成测试:

client = r.Client(config, creds)
3

运行配置测试:

client = r.Client(config, creds)
4

仅运行客户端/API集成测试:

client = r.Client(config, creds)
5

仅运行附加功能测试:

client = r.Client(config, creds)
6

致谢

这个库的开发灵感来自于pypi上的soap客户端asresponses。 Oracle用于重型建筑和维护其API。

法律

此代码既不受Oracle、Responsys或任何相关实体的官方支持,也不受其认可。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
安卓在java中加入字符串组以创建复合字符串   java系统甚至不点击“下一步”或“上一步”按钮就将我返回到上一页,而不是进入下一页   java如何在arrayList中获取特定列的不同值   CXF GZIP REST JAVA   Java:使用大量半恒定标志检查优化循环中的循环?   java如何在两个应用程序之间进行会话管理?   java SVG文件使用蜡染(但没有轴线)转换为PNG   使用协议缓冲区和内部数据模型的java   java如何在logtag 安卓中打印和查看字符串的值   javascript如何在NodeJs中应用Java/Spring的分层架构?   java Spring URL在JSP中编码不正确   模式对话框后面的java工具提示   java WSRPC生成日历对象而不是日期   在对象外部无法识别类变量   java将图像从文件读/写到BuffereImage的最快方法?   JavaSpring数据存储库对具有不同Id的子类使用抽象超类   安全在Java 5.0上运行web应用程序服务器有危险吗?