如何使用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
相关产品推荐
相关产品推荐

