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

GoDaddy API域名批量获取自动化:IntelliJ中401认证错误排查

解决GoDaddy API RestAssured调用返回401认证错误的问题

我在Postman里能正常发送GET请求调用GoDaddy API获取账户下所有域名,但用IntelliJ里的RestAssured代码执行时却一直返回401认证错误。以下是我的代码、配置和错误信息:

测试类代码

package godaddy;

import files.Resources;
import io.restassured.RestAssured;
import io.restassured.http.ContentType;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.equalTo;

public class GodaddyGetTest {
    Properties prop = new Properties();

    @BeforeTest
    public void getData() throws IOException {
        FileInputStream fis = new FileInputStream("C:\\Users\\nerdi\\RestApiCourse\\src\\files\\env.properties");
        prop.load(fis);
        //prop.getProperty("HOST");
    }

    @Test
    public void Test(){
        //BaseURL or Host
        RestAssured.baseURI = prop.getProperty("GODADDYHOST");

        given().
                header("Authorization", "GODADDYKEY").
                header("Content-Type", "application/json").
                header("Accept", "application/json").
        when().
                get(Resources.godaddyGetData()).
        then().assertThat().statusCode(200).
                and(). contentType(ContentType.JSON);
    }
}

密钥与HOST配置

  • 密钥格式:sso-key Key:SecretKey
  • GODADDYHOST配置:https://api.godaddy.com

Resources类方法

public static String godaddyGetData(){
    String res = "/v1/domains";
    return res;
}

错误栈信息

java.lang.AssertionError: 1 expectation failed.
Expected status code <200> but was <401>.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:83)
at org.codehaus.groovy.reflection.CachedConstructor.doConstructorInvoke(CachedConstructor.java:77)
at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrap.callConstructor(ConstructorSite.java:84)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:60)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:235)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:247)
at io.restassured.internal.ResponseSpecificationImpl$HamcrestAssertionClosure.validate(ResponseSpecificationImpl.groovy:483)
at io.restassured.internal.ResponseSpecificationImpl$HamcrestAssertionClosure$validate$1.call(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
at io.restassured.internal.ResponseSpecificationImpl.validateResponseIfRequired(ResponseSpecificationImpl.groovy:655)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
at io.restassured.internal.ResponseSpecificationImpl.statusCode(ResponseSpecificationImpl.groovy:123)
at io.restassured.specification.ResponseSpecification$statusCode$0.callCurrent(Unknown Source)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
at io.restassured.internal.ResponseSpecificationImpl.statusCode(ResponseSpecificationImpl.groovy:131)
at io.restassured.internal.ValidatableResponseOptionsImpl.statusCode(ValidatableResponseOptionsImpl.java:119)
at godaddy.GodaddyGetTest.Test(GodaddyGetTest.java:44)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

问题排查与解决方案

1. 修复Authorization头的格式问题

这是最可能的原因:GoDaddy API要求认证头必须是 Authorization: sso-key <Key>:<Secret>,但你的代码里直接写了header("Authorization", "GODADDYKEY")——这里的"GODADDYKEY"是字符串字面量,而不是读取配置文件里的密钥值!

你需要修改代码,从配置文件中读取密钥并加上sso-key 前缀:

.header("Authorization", "sso-key " + prop.getProperty("GODADDYKEY"))

同时确保你的env.properties里的GODADDYKEY值是Key:SecretKey(不要包含sso-key 前缀,因为代码里已经加上了)。

2. 验证配置文件读取是否正确

可以在getData()方法里加一行日志,确认密钥是否正确读取:

System.out.println("读取到的密钥:" + prop.getProperty("GODADDYKEY"));

如果打印出来是null或者不是预期的Key:SecretKey,说明配置文件路径有误,或者键名写错了(检查配置文件里的键名是否和代码里一致)。

3. 确认API环境匹配

GoDaddy有测试环境和生产环境两个不同的API地址:

  • 测试环境:https://api.ote-godaddy.com
  • 生产环境:https://api.godaddy.com

如果你的密钥是在测试环境生成的,却用了生产环境的HOST,也会导致401认证失败。确认你的密钥和HOST是对应的环境。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:35:16