You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

在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代码更简洁,不用在每个接口里重复写认证和初始化代码。给你一个实用的实现方案:

  1. 创建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);
    }
}
  1. 在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

火山引擎 最新活动