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
相关产品推荐
相关产品推荐

