You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python提交Jira服务门户表单?

使用Python提交Jira服务门户表单创建Issue

可以实现,但不能直接POST到服务门户的页面URL(你之前尝试的https://instance.atlassian.net/servicedesk/customer/portal/1/create/1是前端页面地址,不是API接口),需要使用Jira Service Desk官方提供的Customer Request API来提交表单创建Issue。

核心要点

  • 认证方式依然沿用你熟悉的「邮箱+API Token」Basic Auth
  • 正确的API端点是:https://<你的实例域名>/rest/servicedeskapi/request
  • 需要先确认表单对应的请求类型ID(即你示例中create/1的1,建议通过API或页面验证确认准确性)

步骤1:获取请求类型ID(可选,已知则跳过)

如果不确定目标表单的请求类型ID,可通过以下API查询:

import requests
import base64

# 配置信息
email = "your-email@example.com"
api_token = "your-api-token"
instance_domain = "instance.atlassian.net"
service_desk_id = 1  # 门户ID,对应示例中的portal/1

# 构造Basic Auth凭证
auth_str = f"{email}:{api_token}"
base64_auth = base64.b64encode(auth_str.encode('utf-8')).decode('utf-8')

headers = {
    "Authorization": f"Basic {base64_auth}",
    "Accept": "application/json"
}

# 发送查询请求
url = f"https://{instance_domain}/rest/servicedeskapi/servicedesk/{service_desk_id}/requesttype"
response = requests.get(url, headers=headers)

# 打印所有请求类型信息,找到目标表单对应的id
print(response.json())

步骤2:使用requests提交表单(推荐)

import requests
import base64
import json

# 配置信息
email = "your-email@example.com"
api_token = "your-api-token"
instance_domain = "instance.atlassian.net"
service_desk_id = 1
request_type_id = 1  # 步骤1中获取的目标表单ID

# 构造认证头
auth_str = f"{email}:{api_token}"
base64_auth = base64.b64encode(auth_str.encode('utf-8')).decode('utf-8')
headers = {
    "Authorization": f"Basic {base64_auth}",
    "Accept": "application/json",
    "Content-Type": "application/json"
}

# 构造请求体,字段需与表单完全对应(含自定义字段)
payload = json.dumps({
    "serviceDeskId": service_desk_id,
    "requestTypeId": request_type_id,
    "requestFieldValues": {
        "summary": "测试服务门户表单提交",
        "description": "通过Python脚本提交的Jira服务请求",
        # 自定义字段格式:"customfield_XXX": "字段值",XXX为字段ID
        # "customfield_12345": "自定义字段内容"
    }
})

# 发送POST请求
url = f"https://{instance_domain}/rest/servicedeskapi/request"
response = requests.post(url, headers=headers, data=payload)

# 处理响应
if response.status_code == 201:
    result = response.json()
    print(f"表单提交成功!Issue链接:{result['_links']['web']}")
else:
    print(f"提交失败,状态码:{response.status_code}")
    print("错误详情:", response.json())

步骤3:使用jira模块提交(可选)

jira模块未封装Service Desk API,但可通过底层会话对象调用:

from jira import JIRA
import json

# 初始化JIRA连接
jira_connection = JIRA(
    basic_auth=('your-email@example.com', 'your-api-token'),
    server="https://instance.atlassian.net"
)

# 构造请求体
payload = {
    "serviceDeskId": 1,
    "requestTypeId": 1,
    "requestFieldValues": {
        "summary": "测试表单提交",
        "description": "通过jira模块提交的服务请求"
    }
}

# 发送请求
response = jira_connection._session.post(
    "rest/servicedeskapi/request",
    data=json.dumps(payload),
    headers={"Content-Type": "application/json"}
)

print(response.json())

你之前请求失败的原因

直接POST到门户页面URL时,该地址是前端渲染页面的入口,需要携带Cookie、CSRF令牌等前端验证信息,且请求格式与API规范不符,因此返回400错误。使用官方API则无需处理这些前端验证,只需按规范构造请求即可。

内容的提问来源于stack exchange,提问作者cttrader

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 12:17:44