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

Robot Framework调用Azure获取令牌遇404错误求助

解决Robot Framework调用Azure OAuth2令牌接口返回404的问题

我帮你梳理下代码里的几个关键问题,这应该是导致404和请求失败的核心原因:


问题点分析

  1. URL配置冲突:你在Create Session时已经传入了完整的令牌接口URL,但后续Post Request又使用了未定义的${url}变量,这会导致请求路径拼接错误,最终返回404。
  2. Content-Type设置错误:Azure的client_credentials模式要求请求体是application/x-www-form-urlencoded格式,但你代码里把请求头的Content-Type设成了application/json,服务端无法正确解析这种格式的参数。
  3. 参数传递方式有误:表单格式的请求需要用表单键值对传递参数,而不是按JSON格式处理。

修正后的Robot Framework代码

*** Settings ***
Library    RequestsLibrary
Library    Collections

*** Variables ***
${TENANT_ID}    xxxxxxxxxx  # 替换为你的租户ID
${RESOURCE}    xxxxxxxxxx    # 替换为你的目标资源ID
${GRANT_TYPE}    client_credentials
${CLIENT_SECRET}    xxxxxxxxxx
${CLIENT_ID}    xxxxxxxxxx
${BASE_URL}    https://login.microsoftonline.com/

*** Test Cases ***
Get Azure OAuth2 Token
    [Tags]    azure    oauth2
    # 创建会话,仅传入基础域名
    Create Session    azure    ${BASE_URL}
    # 拼接令牌接口的完整路径
    ${token_path}    Set Variable    ${TENANT_ID}/oauth2/token
    # 构造表单格式的请求参数
    &{data}    Create Dictionary    client_id=${CLIENT_ID}
    ...    client_secret=${CLIENT_SECRET}
    ...    grant_type=${GRANT_TYPE}
    ...    resource=${RESOURCE}
    # 设置正确的请求头
    &{headers}    Create Dictionary    Content-Type=application/x-www-form-urlencoded
    # 发送POST请求,指定data参数传递表单数据
    ${resp}    Post Request    azure    ${token_path}    data=${data}    headers=${headers}
    # 验证请求状态码
    Should Be Equal As Strings    ${resp.status_code}    200
    # 可选:打印返回的令牌信息
    Log    ${resp.json()}    INFO

关键修正说明

  • 将基础URL和接口路径拆分,避免Session与Post请求的URL拼接冲突
  • 明确使用application/x-www-form-urlencoded作为Content-Type,匹配Azure接口要求
  • 使用data=${data}传递表单参数,而非JSON格式
  • 显式声明Collections库(部分版本的RequestsLibrary自带该功能,但显式声明更稳妥)

对应的Python参考代码(与Robot逻辑完全对齐)

import requests

# 配置参数
tenant_id = "xxxxxxxxxx"
client_id = "xxxxxxxxxx"
client_secret = "xxxxxxxxxx"
grant_type = "client_credentials"
resource = "xxxxxxxxxx"
base_url = "https://login.microsoftonline.com/"

# 构造请求地址与参数
url = f"{base_url}{tenant_id}/oauth2/token"
form_data = {
    "client_id": client_id,
    "client_secret": client_secret,
    "grant_type": grant_type,
    "resource": resource
}
headers = {
    "Content-Type": "application/x-www-form-urlencoded"
}

# 发送请求并验证结果
response = requests.post(url, data=form_data, headers=headers)
assert response.status_code == 200, f"请求失败,状态码:{response.status_code}"
print("令牌获取成功:", response.json())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:41:56