华为云用户手册

  • URI GET /v2/kafka/{project_id}/instances/{instance_id}/kafka-user-client-quota 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 项目ID,获取方式请参见获取项目ID。 instance_id 是 String 实例ID。 表2 Query参数 参数 是否必选 参数类型 描述 offset 否 Integer 偏移量,表示查询该偏移量后面的记录。 最小值:0 最大值:10000 limit 否 Integer 查询返回记录的数量限制。 最小值:1 最大值:50
  • 响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 quotas Array of Quota objects 客户端流控配置列表。 count Integer 用户/客户端流控配置数目。 表4 Quota 参数 参数类型 描述 user String 用户名 client String 客户端ID user-default Boolean 是否使用用户默认设置(是则表示对全部用户限流)。 client-default Boolean 是否使用客户端默认设置(是则表示对全部客户端限流)。 producer-byte-rate Long 生产上限速率(单位为B/s) consumer-byte-rate Long 消费上限速率(单位为B/s)
  • 响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 failed_groups Array of failed_groups objects 删除失败的消费组列表。 total Integer 删除失败的个数 表4 failed_groups 参数 参数类型 描述 group_id String 删除失败的消费组ID。 error_message String 删除失败的原因。
  • URI GET /v2/{project_id}/instances/{instance_id}/groups 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 项目ID,获取方式请参见获取项目ID。 instance_id 是 String 实例ID。 表2 Query参数 参数 是否必选 参数类型 描述 offset 否 String 偏移量,表示从此偏移量开始查询, offset大于等于0。 limit 否 String 当次查询返回的最大消费组ID个数,默认值为10,取值范围为1~50。 group 否 String 消费组名过滤查询,过滤方式为字段包含过滤。
  • 响应示例 状态码: 200 查询实例集群的所有消费组成功。 { "groups" : [ { "createdAt" : 1691401194847, "group_id" : "consumer-1", "state" : "EMPTY", "coordinator_id" : 1, "lag" : 0, "group_desc" : null }, { "createdAt" : 1691401194960, "group_id" : "consumer-2", "state" : "STABLE", "coordinator_id" : 2, "lag" : 0, "group_desc" : null }, { "createdAt" : 1691401207309, "group_id" : "consumer-3", "state" : "STABLE", "coordinator_id" : 3, "lag" : 0, "group_desc" : null } ], "total" : 3 }
  • 响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 groups Array of GroupInfoSimple objects 所有的消费组。 total Integer 所有的消费组总数。 表4 GroupInfoSimple 参数 参数类型 描述 createdAt Long 创建时间。 group_id String 消费组ID。 state String 消费组状态。包含以下状态: Dead:消费组内没有任何成员,且没有任何元数据。 Empty:消费组内没有任何成员,存在元数据。 PreparingRebalance:准备开启rebalance。 CompletingRebalance:所有成员加入group。 Stable:消费组内成员可正常消费。 coordinator_id Integer 协调器编号。 group_desc String 消费组描述。 lag Long 堆积数。
  • URI GET /v1.0/{project_id}/instance/{instance_id}/manage/topic/{topic_name}/partition/{partition}/offset/{offset}/message 参数说明见表1。 表1 参数说明 参数 类型 必选 说明 project_id String 是 项目ID。 instance_id String 是 实例ID。 topic_name String 是 topic名称。 partition Integer 是 分区编号。取值范围:0~19。 offset String 是 消息位置。
  • 响应消息 响应参数 参数说明见表2。 表2 响应参数说明 参数 类型 说明 message object of message 消息列表,见表表3。 表3 message参数 参数 类型 说明 key String 消息的key。 value String 消息内容。 topic String Topic名称。 partition Integer 分区编号。 message_offset Long 消息位置。 size Integer 消息大小,单位字节。 timestamp Long 消息时间戳。 响应示例 { "message": { "topic": "mytest", "partition": 0, "message_offset": 7, "key": null, "value": "kasjdf", "size": 6, "timestamp": 1568125036045 } }
  • 响应参数 状态码: 200 表1 响应Body参数 参数 参数类型 描述 region_id String 区域ID。 available_zones Array of available_zones objects 可用区数组。 表2 available_zones 参数 参数类型 描述 soldOut Boolean 是否售罄。 id String 可用区ID。 code String 可用区编码。 name String 可用区名称。 port String 可用区端口号。 resource_availability String 可用区上是否还有可用资源。 default_az Boolean 是否为默认可用区。 remain_time Long 剩余时间。 ipv6_enable Boolean 是否支持IPv6。
  • 响应示例 状态码: 200 查询可用区信息成功。 { "region_id" : "xxx", "available_zones" : [ { "soldOut" : false, "id" : "d539378ec1314c85b76fefa3f7071458", "code" : "xxx", "name" : "可用区2", "port" : "8003", "resource_availability" : "true", "default_az" : true, "remain_time" : 9223372036854776000, "ipv6_enable" : false }, { "soldOut" : false, "id" : "9f1c5806706d4c1fb0eb72f0a9b18c77", "code" : "xxx", "name" : "可用区3", "port" : "443", "resource_availability" : "true", "default_az" : false, "remain_time" : 9223372036854776000, "ipv6_enable" : false } ] }
  • 请求消息 请求参数 参数说明见表2。 表2 参数说明 参数 类型 必选 说明 name String 否 实例名称。 由英文字符开头,只能由英文字母、数字、中划线组成,长度为4~64的字符。 description String 否 实例的描述信息。 长度不超过1024的字符串。 说明: \与"在json报文中属于特殊字符,如果参数值中需要显示\或者"字符,请在字符前增加转义字符\,比如\\或者\"。 maintain_begin String 否 维护时间窗开始时间,格式为HH:mm:ss。 维护时间窗开始和结束时间必须为指定的时间段,可参考查询维护时间窗时间段。 开始时间必须为22:00:00、02:00:00、06:00:00、10:00:00、14:00:00和18:00:00。 该参数不能单独为空,若该值为空,则结束时间也为空。系统分配一个默认开始时间02:00:00。 maintain_end String 否 维护时间窗结束时间,格式为HH:mm:ss。 维护时间窗开始和结束时间必须为指定的时间段,可参考查询维护时间窗时间段。 结束时间在开始时间基础上加四个小时,即当开始时间为22:00:00时,结束时间为02:00:00。 该参数不能单独为空,若该值为空,则开始时间也为空。系统分配一个默认结束时间06:00:00。 security_group_id String 否 安全组ID。 retention_policy String 否 容量阈值策略。 支持两种策略模式: produce_reject: 生产受限 time_base: 自动删除 enterprise_project_id String 否 企业项目。 请求示例 示例1 : PUT https://{dms_endpoint}/v1.0/{project_id}/instances/{instance_id} { "name": "dms002", "description": "instance description" } 示例2 PUT https://{dms_endpoint}/v1.0/{project_id}/instances/{instance_id} { "name": "dms002", "description": "instance description", "maintain_begin":"02:00:00", "maintain_end":"06:00:00" }
  • URI POST /v1.0/{project_id}/instances/{instance_id}/manage/topics/{topic}/replicas-reassignment 参数说明如下表所示。 表1 参数说明 参数 类型 必选 说明 project_id String 是 项目ID。 instance_id String 是 实例ID。 topic String 是 Topic名称。
  • 请求消息 请求参数 表2 参数说明 参数 类型 必选 说明 partitions Array of object partitions 是 期望调整的分区副本分配情况。参数参考表3。 表3 partitions参数说明 参数 类型 必选 说明 partition Integer 是 分区ID。 replicas Array of integer 是 副本期望所在的broker ID。其中Array首位为leader副本,所有分区需要有同样数量的副本,副本数不能大于总broker的数量。 请求示例 { "partitions": [ { "partition": 1, "replicas": [ 1, 2 ] }, { "partition": 0, "replicas": [ 0, 1 ] } ] }
  • URI GET /v2/{project_id}/instances/{instance_id}/management/topics/{topic}/partitions/{partition}/message 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 项目ID,获取方式请参见获取项目ID。 instance_id 是 String 实例ID。 topic 是 String Topic名称。 Topic名称必现以字母开头且只支持大小写字母、中横线、下划线以及数字。 partition 是 Integer 分区编号。 表2 Query参数 参数 是否必选 参数类型 描述 message_offset 是 String 消息位置。
  • 响应示例 状态码: 200 查询分区指定偏移量的消息成功。 { "message" : [ { "topic" : "mytest", "partition" : 0, "message_offset" : 7, "key" : null, "value" : "kasjdf", "size" : 6, "timestamp" : 1568125036045 } ] }
  • 响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 message Array of ShowPartitionMessageEntity objects 消息列表。 表4 ShowPartitionMessageEntity 参数 参数类型 描述 key String 消息的key。 value String 消息内容。 topic String Topic名称。 partition Integer 分区编号。 message_offset Long 消息位置。 size Integer 消息大小,单位字节。 timestamp Long 生产消息的时间。 格式为Unix时间戳。单位为毫秒。
  • 请求参数 表2 请求Body参数 参数 是否必选 参数类型 描述 user 否 String 用户名 client 否 String 客户端ID user-default 否 Boolean 是否使用用户默认设置(是则表示对全部用户限流)。 client-default 否 Boolean 是否使用客户端默认设置(是则表示对全部客户端限流)。 producer-byte-rate 否 Long 生产上限速率(单位为B/s) consumer-byte-rate 否 Long 消费上限速率(单位为B/s)
  • 请求示例 创建用户/客户端流控配置。 POST https://{endpoint}/v2/kafka/{project_id}/instances/{instance_id}/kafka-user-client-quota { "user" : "", "client" : "", "user-default" : false, "client-default" : true, "producer-byte-rate" : 3145728, "consumer-byte-rate" : 2097152 }
  • URI PUT /v2/{engine}/{project_id}/instances/{instance_id}/users/{user_name} 表1 路径参数 参数 是否必选 参数类型 描述 engine 是 String 消息引擎的类型。 project_id 是 String 项目ID,获取方式请参见获取项目ID。 instance_id 是 String 实例ID。 user_name 是 String 用户名称。
  • 响应消息 响应参数 参数说明见表2。 表2 参数说明 参数 类型 说明 total Integer topic总数。 size Integer 分页查询的大小。 remain_partitions Integer 剩余分区数。 max_partitions Integer 分区总数。 topics Array Topic列表。 表3 参数说明 参数 类型 说明 policiesOnly Boolean 是否为默认策略。 id String Topic名称 replication Integer 副本数,配置数据的可靠性 partition Integer Topic分区数,设置消费的并发数。 retention_time Integer 消息老化时间。 sync_replication Boolean 是否开启同步复制,开启后,客户端生产消息时相应的也要设置acks=-1,否则不生效。 默认关闭。 sync_message_flush Boolean 是否使用同步落盘。同步落盘会导致性能降低。 external_configs Object 扩展配置。 topic_type Integer Topic类型。 响应示例 { "count": 1, "topics": [ { "id": "topic-test", "replication": 3, "partition": 4, "retention_time": 72, "sync_replication": "false", "sync_message_flush": "false" } ] }
  • 请求消息头 附加请求头字段,如指定的URI和HTTP方法所要求的字段。例如定义消息体类型的请求头“Content-Type”,请求鉴权信息等。 详细的公共请求消息头字段请参见表2。 表2 公共请求消息头 名称 描述 是否必选 示例 Host 请求的服务器信息,从服务API的URL中获取。值为hostname[:port]。端口缺省时使用默认的端口,https的默认端口为443。 否 使用AK/SK认证时该字段必选。 code.test.com or code.test.com:443 Content-Type 消息体的类型(格式)。推荐用户使用默认值application/json,有其他取值时会在具体接口中说明。 是 application/json Content-Length 请求body长度,单位为Byte。 否 3495 X-Project-Id project id,项目编号。请参考获取项目ID章节获取项目编号。 否 如果是专属云场景采用AK/SK认证方式的接口请求,或者多project场景采用AK/SK认证的接口请求,则该字段必选。 e9993fc787d94b6c886cbaa340f9c0f4 X-Auth-Token 用户Token。 用户Token也就是调用获取用户Token接口的响应值,该接口是唯一不需要认证的接口。 请求响应成功后在响应消息头(Headers)中包含的“X-Subject-Token”的值即为Token值。 否 使用Token认证时该字段必选。 注:以下仅为Token示例片段。 MIIPAgYJKoZIhvcNAQcCo...ggg1BBIINPXsidG9rZ API同时支持使用AK/SK认证,AK/SK认证是使用SDK对请求进行签名,签名过程会自动往请求中添加Authorization(签名认证信息)和X-Sdk-Date(请求发送的时间)请求头。 AK/SK认证的详细说明请参见认证鉴权的“AK/SK认证”。 对于获取用户Token接口,由于不需要认证,所以只添加“Content-Type”即可,添加消息头后的请求如下所示。 POST https://iam.cn-north-1.myhuaweicloud.com/v3/auth/tokens Content-Type: application/json
  • 请求消息体(可选) 该部分可选。请求消息体通常以结构化格式(如JSON或XML)发出,与请求消息头中Content-type对应,传递除请求消息头之外的内容。若请求消息体中参数支持中文,则中文字符必须为UTF-8编码。 每个接口的请求消息体内容不同,也并不是每个接口都需要有请求消息体(或者说消息体为空),GET、DELETE操作类型的接口就不需要消息体,消息体具体内容需要根据具体接口而定。 对于获取用户Token接口,您可以从接口的请求部分看到所需的请求参数及参数说明。将消息体加入后的请求如下所示,加粗的斜体字段需要根据实际值填写,其中username为用户名,domainname为用户所属的账号名称,********为用户登录密码,xxxxxxxxxxxxxxxxxx为project的名称,如“cn-north-4”,您可以从地区和终端节点获取。 scope参数定义了Token的作用域,上面示例中获取的Token仅能访问project下的资源。您还可以设置Token作用域为某个账号下所有资源或账号的某个project下的资源,详细定义请参见获取用户Token。 POST https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens Content-Type: application/json { "auth": { "identity": { "methods": [ "password" ], "password": { "user": { "name": "username", "password": "********", "domain": { "name": "domainname" } } } }, "scope": { "project": { "name": "xxxxxxxxxxxxxxxxxx" } } } } 到这里为止这个请求需要的内容就具备齐全了,您可以使用curl、Postman或直接编写代码等方式发送请求调用API。对于获取用户Token接口,返回的响应消息头中“x-subject-token”就是需要获取的用户Token。有了Token之后,您就可以使用Token认证调用其他API。
  • 请求方法 HTTP请求方法(也称为操作或动词),它告诉服务你正在请求什么类型的操作。 GET:请求服务器返回指定资源。 PUT:请求服务器更新指定资源。 POST:请求服务器新增资源或执行特殊操作。 DELETE:请求服务器删除指定资源,如删除对象等。 HEAD:请求服务器资源头部。 PATCH:请求服务器更新资源的部分内容。当资源不存在的时候,PATCH可能会去创建一个新的资源。 在获取用户Token的URI部分,您可以看到其请求方法为“POST”,则其请求为: POST https://iam.cn-north-1.myhuaweicloud.com/v3/auth/tokens
  • 请求URI 请求URI由如下部分组成。 {URI-scheme}://{Endpoint}/{resource-path}?{query-string} 尽管请求URI包含在请求消息头中,但大多数语言或框架都要求您从请求消息中单独传递它,所以在此单独强调。 表1 URI中的参数说明 参数 描述 URI-scheme 表示用于传输请求的协议,当前所有API均采用HTTPS协议。 Endpoint 指定承载REST服务端点的服务器域名或IP,不同服务不同区域的Endpoint不同,您可以从地区和终端节点获取。 例如IAM服务在“华北-北京四”区域的Endpoint为“iam.cn-north-4.myhuaweicloud.com”。 resource-path 资源路径,即API访问路径。从具体API的URI模块获取,例如“获取用户Token”API的resource-path为“/v3/auth/tokens”。 query-string 查询参数,是可选部分,并不是每个API都有查询参数。查询参数前面需要带一个“?”,形式为“参数名=参数取值”,例如“?limit=10”,表示查询不超过10条数据。 例如您需要获取IAM在“华北-北京四”区域的Token,则需使用“华北-北京四”区域的Endpoint(iam.cn-north-4.myhuaweicloud.com),并在获取用户Token的URI部分找到resource-path(/v3/auth/tokens),拼接起来如下所示。 https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens 图1 URI示意图 为查看方便,在每个具体API的URI部分,只给出resource-path部分,并将请求方法写在一起。这是因为URI-scheme都是HTTPS,而Endpoint在同一个区域也相同,所以简洁起见将这两部分省略。
  • 请求示例 删除用户/客户端流控配置。 DELETE https://{endpoint}/v2/kafka/{project_id}/instances/{instance_id}/kafka-user-client-quota { "user" : "", "client" : "", "user-default" : false, "client-default" : true }
  • URI PUT /v2/{engine}/{project_id}/instances/{instance_id}/groups/{group} 表1 路径参数 参数 是否必选 参数类型 描述 engine 是 String 消息引擎的类型。 project_id 是 String 项目ID,获取方式请参见获取项目ID。 instance_id 是 String 实例ID。 group 是 String 消费者组。
  • 请求示例 修改实例跨VPC访问的内网IP。 POST https://{endpoint}/v2/{project_id}/instances/{instance_id}/crossvpc/modify { "advertised_ip_contents" : { "192.168.245.246" : "192.168.245.247", "192.168.197.36" : "192.168.197.38", "192.168.190.11" : "192.168.190.11" } }
  • 响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 success Boolean 修改跨VPC访问结果。 results Array of results objects 修改broker跨VPC访问的结果列表。 表4 results 参数 参数类型 描述 advertised_ip String advertised.listeners IP/域名。 success Boolean 修改broker跨VPC访问的状态。 ip String listeners IP。
  • 响应示例 状态码: 200 修改实例跨VPC访问的内网IP成功。 { "success" : true, "results" : [ { "advertised_ip" : "192.168.197.36", "success" : true, "ip" : "192.168.197.36" }, { "advertised_ip" : "192.168.190.11", "success" : true, "ip" : "192.168.190.11" }, { "advertised_ip" : "192.168.245.255", "success" : true, "ip" : "192.168.245.246" } ] }
  • 响应示例 状态码: 200 查询产品规格列表成功。 { "engine" : "kafka", "versions" : [ "1.1.0", "2.3.0" ], "products" : [ { "type" : "cluster", "product_id" : "c6.2u4g.cluster", "ecs_flavor_id" : "c6.large.2", "billing_code" : "dms.platinum.c6", "arch_types" : [ "X86" ], "charging_mode" : [ "monthly", "hourly" ], "ios" : [ { "io_spec" : "dms.physical.storage.high.v2", "type" : "evs", "available_zones" : [ "xxx", "xxx" ], "unavailable_zones" : [ "xxx", "xxx" ] }, { "io_spec" : "dms.physical.storage.ultra.v2", "type" : "evs", "available_zones" : [ "xxx", "xxx" ], "unavailable_zones" : [ "xxx", "xxx" ] } ], "support_features" : [ { "name" : "connector_obs", "properties" : { "max_task" : "10", "max_node" : "10", "min_task" : "1", "min_node" : "2" } } ], "properties" : { "max_partition_per_broker" : "250", "max_broker" : "30", "max_storage_per_node" : "10000", "max_consumer_per_broker" : "4000", "min_broker" : "3", "max_bandwidth_per_broker" : "100", "min_storage_per_node" : "200", "max_tps_per_broker" : "30000", "product_alias" : "kafka.2u4g.cluster" } }, { "type" : "cluster", "product_id" : "c6.4u8g.cluster", "ecs_flavor_id" : "c6.xlarge.2", "billing_code" : "dms.platinum.c6", "arch_types" : [ "X86" ], "charging_mode" : [ "monthly", "hourly" ], "ios" : [ { "io_spec" : "dms.physical.storage.high.v2", "type" : "evs", "available_zones" : [ "xxx", "xxx" ], "unavailable_zones" : [ "xxx", "xxx" ] }, { "io_spec" : "dms.physical.storage.ultra.v2", "type" : "evs", "available_zones" : [ "xxx", "xxx" ], "unavailable_zones" : [ "xxx", "xxx" ] } ], "support_features" : [ { "name" : "connector_obs", "properties" : { "max_task" : "10", "max_node" : "10", "min_task" : "1", "min_node" : "2" } } ], "properties" : { "max_partition_per_broker" : "500", "max_broker" : "30", "max_storage_per_node" : "20000", "max_consumer_per_broker" : "4000", "min_broker" : "3", "max_bandwidth_per_broker" : "100", "min_storage_per_node" : "400", "max_tps_per_broker" : "100000", "product_alias" : "kafka.4u8g.cluster" } }, { "type" : "cluster", "product_id" : "c6.8u16g.cluster", "ecs_flavor_id" : "c6.2xlarge.2", "billing_code" : "dms.platinum.c6", "arch_types" : [ "X86" ], "charging_mode" : [ "monthly", "hourly" ], "ios" : [ { "io_spec" : "dms.physical.storage.high.v2", "type" : "evs", "available_zones" : [ "xxx", "xxx" ], "unavailable_zones" : [ "xxx", "xxx" ] }, { "io_spec" : "dms.physical.storage.ultra.v2", "type" : "evs", "available_zones" : [ "xxx", "xxx" ], "unavailable_zones" : [ "xxx", "xxx" ] } ], "support_features" : [ { "name" : "connector_obs", "properties" : { "max_task" : "10", "max_node" : "10", "min_task" : "1", "min_node" : "2" } } ], "properties" : { "max_partition_per_broker" : "1000", "max_broker" : "30", "max_storage_per_node" : "30000", "max_consumer_per_broker" : "4000", "min_broker" : "3", "max_bandwidth_per_broker" : "100", "min_storage_per_node" : "800", "max_tps_per_broker" : "150000", "product_alias" : "kafka.8u16g.cluster" } }, { "type" : "cluster", "product_id" : "c6.12u24g.cluster", "ecs_flavor_id" : "c6.3xlarge.2", "billing_code" : "dms.platinum.c6", "arch_types" : [ "X86" ], "charging_mode" : [ "monthly", "hourly" ], "ios" : [ { "io_spec" : "dms.physical.storage.high.v2", "type" : "evs", "available_zones" : [ "xxx", "xxx" ], "unavailable_zones" : [ "xxx", "xxx" ] }, { "io_spec" : "dms.physical.storage.ultra.v2", "type" : "evs", "available_zones" : [ "xxx", "xxx" ], "unavailable_zones" : [ "xxx", "xxx" ] } ], "support_features" : [ { "name" : "connector_obs", "properties" : { "max_task" : "10", "max_node" : "10", "min_task" : "1", "min_node" : "2" } } ], "properties" : { "max_partition_per_broker" : "1500", "max_broker" : "30", "max_storage_per_node" : "30000", "max_consumer_per_broker" : "4000", "min_broker" : "3", "max_bandwidth_per_broker" : "100", "min_storage_per_node" : "1200", "max_tps_per_broker" : "200000", "product_alias" : "kafka.12u24g.cluster" } }, { "type" : "cluster", "product_id" : "c6.16u32g.cluster", "ecs_flavor_id" : "c6.4xlarge.2", "billing_code" : "dms.platinum.c6", "arch_types" : [ "X86" ], "charging_mode" : [ "monthly", "hourly" ], "ios" : [ { "io_spec" : "dms.physical.storage.high.v2", "type" : "evs", "available_zones" : [ "xxx", "xxx" ], "unavailable_zones" : [ "xxx", "xxx" ] }, { "io_spec" : "dms.physical.storage.ultra.v2", "type" : "evs", "available_zones" : [ "xxx", "xxx" ], "unavailable_zones" : [ "xxx", "xxx" ] } ], "support_features" : [ { "name" : "connector_obs", "properties" : { "max_task" : "10", "max_node" : "10", "min_task" : "1", "min_node" : "2" } } ], "properties" : { "max_partition_per_broker" : "2000", "max_broker" : "30", "max_storage_per_node" : "30000", "max_consumer_per_broker" : "4000", "min_broker" : "3", "max_bandwidth_per_broker" : "100", "min_storage_per_node" : "1600", "max_tps_per_broker" : "250000", "product_alias" : "kafka.16u32g.cluster" } } ] }
共100000条