在ASP.NET中使用AdWords API,是否可避免使用`user`对象?
我正在构建一个Node应用,但需要获取Google AdWords的数据。由于没有官方Node库,且非官方库无法正常工作,因此我打算在ASP.NET中创建一个REST API。目前我的代码如下:
[HttpGet] public IEnumerable<string> Get() { TargetingIdeaSelector selector = new TargetingIdeaSelector { requestType = RequestType.IDEAS, ideaType = IdeaType.KEYWORD, requestedAttributeTypes = new AttributeType[] { AttributeType.KEYWORD_TEXT, AttributeType.SEARCH_VOLUME, // 其他属性... } // 其他选择器配置... }; // 这里原本需要用user对象来调用AdWords服务 }请问在ASP.NET中使用AdWords API时,是否可以避免使用
user对象?
回答
核心结论:无法完全避开,但可以优雅封装
Google AdWords API(现在官方已升级为Google Ads API,旧版逻辑类似)的架构设计就是以User对象为核心的——它承担了认证、会话管理、请求路由等底层工作,所有和AdWords服务的交互都必须通过这个对象初始化客户端,所以完全绕过它是不可能的。
不过你不用为此头疼,通过封装User的创建逻辑,可以让你的API代码更简洁,不用在每个接口里重复写认证和初始化代码。给你一个实用的实现方案:
- 创建AdWords服务辅助类
把User的初始化逻辑抽离到单独的工具类里,从配置文件读取认证信息(避免硬编码):
public static class AdWordsServiceHelper { public static User GetAuthenticatedUser() { // 从appsettings.json或web.config读取配置 var adWordsConfig = new AppConfig { ClientCustomerId = ConfigurationManager.AppSettings["AdWords:ClientCustomerId"], DeveloperToken = ConfigurationManager.AppSettings["AdWords:DeveloperToken"], OAuth2ClientId = ConfigurationManager.AppSettings["AdWords:OAuth2ClientId"], OAuth2ClientSecret = ConfigurationManager.AppSettings["AdWords:OAuth2ClientSecret"], OAuth2RefreshToken = ConfigurationManager.AppSettings["AdWords:OAuth2RefreshToken"] }; return new User(adWordsConfig); } }
- 在API控制器中复用辅助类
这样你的接口代码就会非常清爽,不用关心User的细节:
[HttpGet] public async Task<IEnumerable<string>> GetTargetKeywords() { // 使用using确保资源及时释放 using var adWordsUser = AdWordsServiceHelper.GetAuthenticatedUser(); var targetingIdeaService = adWordsUser.GetService<TargetingIdeaService>(); var selector = new TargetingIdeaSelector { requestType = RequestType.IDEAS, ideaType = IdeaType.KEYWORD, requestedAttributeTypes = new[] { AttributeType.KEYWORD_TEXT, AttributeType.SEARCH_VOLUME }, // 补充必要的过滤条件,比如基于某个网站或关键词扩展 searchParameters = new List<SearchParameter> { new RelatedToQuerySearchParameter { queries = new[] { "你的目标关键词" } } }, paging = new Paging { startIndex = 0, numberResults = 10 } }; var response = await targetingIdeaService.get(selector); // 提取返回结果中的关键词文本 return response.entries.Select(entry => ((StringAttribute)entry.attributes.First(a => a.type == AttributeType.KEYWORD_TEXT)).value); }
额外建议:考虑迁移到Google Ads API
旧版AdWords API已经停止维护,官方强烈推荐迁移到Google Ads API。虽然它同样需要类似的客户端初始化逻辑,但支持更多现代特性,文档和工具也更完善。如果你的项目还在初期阶段,建议直接用新版API,避免后续的迁移成本。
另外,注意User对象的生命周期,用using语句包裹可以确保资源被及时释放,避免内存泄漏问题。
内容的提问来源于stack exchange,提问作者Alex Ironside




