mirror of
https://gitee.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat.git
synced 2025-07-16 07:59:44 +08:00
feat(wxads): 升级公共组件
This commit is contained in:
parent
a7484fd89f
commit
54e7ac8266
@ -1,24 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace SKIT.FlurlHttpClient.Wechat.Ads.Exceptions
|
||||
{
|
||||
public class WechatAdsRequestAgencyTokenException : WechatAdsException
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
internal WechatAdsRequestAgencyTokenException()
|
||||
{
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
internal WechatAdsRequestAgencyTokenException(string message)
|
||||
: base(message)
|
||||
{
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
internal WechatAdsRequestAgencyTokenException(string message, Exception innerException)
|
||||
: base(message, innerException)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace SKIT.FlurlHttpClient.Wechat.Ads.Exceptions
|
||||
{
|
||||
public class WechatAdsRequestTimeoutException : WechatAdsException
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
internal WechatAdsRequestTimeoutException()
|
||||
{
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
internal WechatAdsRequestTimeoutException(string message)
|
||||
: base(message)
|
||||
{
|
||||
}
|
||||
|
||||
/// <inheritdoc/>
|
||||
internal WechatAdsRequestTimeoutException(string message, Exception innerException)
|
||||
: base(message, innerException)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Net.Http;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
@ -25,7 +25,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "adcreatives", "add")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.AdCreativesAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.AdCreativesAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -44,7 +44,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "adcreatives", "update")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.AdCreativesUpdateResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.AdCreativesUpdateResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -63,19 +63,19 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Get, "adcreatives", "get")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
if (request.AdCreativeId != null)
|
||||
if (request.AdCreativeId is not null)
|
||||
flurlReq.SetQueryParam("adcreative_id", request.AdCreativeId.Value);
|
||||
|
||||
if (request.Filters != null)
|
||||
if (request.Filters is not null)
|
||||
flurlReq.SetQueryParam("filtering", client.JsonSerializer.Serialize(request.Filters));
|
||||
|
||||
if (request.PageSize != null)
|
||||
if (request.PageSize is not null)
|
||||
flurlReq.SetQueryParam("page_size", request.PageSize.Value);
|
||||
|
||||
if (request.Page != null)
|
||||
if (request.Page is not null)
|
||||
flurlReq.SetQueryParam("page", request.Page.Value);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.AdCreativesGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.AdCreativesGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "adgroups", "add")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.AdGroupsAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.AdGroupsAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -44,7 +44,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "adgroups", "update")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.AdGroupsUpdateResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.AdGroupsUpdateResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -63,19 +63,19 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Get, "adgroups", "get")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
if (request.AdGroupId != null)
|
||||
if (request.AdGroupId is not null)
|
||||
flurlReq.SetQueryParam("adgroup_id", request.AdGroupId.Value);
|
||||
|
||||
if (request.Filters != null)
|
||||
if (request.Filters is not null)
|
||||
flurlReq.SetQueryParam("filtering", client.JsonSerializer.Serialize(request.Filters));
|
||||
|
||||
if (request.PageSize != null)
|
||||
if (request.PageSize is not null)
|
||||
flurlReq.SetQueryParam("page_size", request.PageSize.Value);
|
||||
|
||||
if (request.Page != null)
|
||||
if (request.Page is not null)
|
||||
flurlReq.SetQueryParam("page", request.Page.Value);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.AdGroupsGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.AdGroupsGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -94,7 +94,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "adgroups", "delete")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.AdGroupsDeleteResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.AdGroupsDeleteResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "ads", "add")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.AdsAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.AdsAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -44,7 +44,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "ads", "update")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.AdsUpdateResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.AdsUpdateResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -63,19 +63,19 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Get, "ads", "get")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
if (request.AdId != null)
|
||||
if (request.AdId is not null)
|
||||
flurlReq.SetQueryParam("ad_id", request.AdId.Value);
|
||||
|
||||
if (request.Filters != null)
|
||||
if (request.Filters is not null)
|
||||
flurlReq.SetQueryParam("filtering", client.JsonSerializer.Serialize(request.Filters));
|
||||
|
||||
if (request.PageSize != null)
|
||||
if (request.PageSize is not null)
|
||||
flurlReq.SetQueryParam("page_size", request.PageSize.Value);
|
||||
|
||||
if (request.Page != null)
|
||||
if (request.Page is not null)
|
||||
flurlReq.SetQueryParam("page", request.Page.Value);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.AdsGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.AdsGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -94,7 +94,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "ads", "delete")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.AdsDeleteResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.AdsDeleteResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "advertiser", "add")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.AdvertiserAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.AdvertiserAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -44,7 +44,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "advertiser", "update")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.AdvertiserUpdateResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.AdvertiserUpdateResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -63,7 +63,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Get, "advertiser", "get")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.AdvertiserGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.AdvertiserGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "async_tasks", "add")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.AsyncTasksAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.AsyncTasksAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -45,16 +45,16 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Get, "async_tasks", "get")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
if (request.Filters != null && request.Filters.Any())
|
||||
if (request.Filters is not null && request.Filters.Any())
|
||||
flurlReq.SetQueryParam("filtering", client.JsonSerializer.Serialize(request.Filters));
|
||||
|
||||
if (request.PageSize != null)
|
||||
if (request.PageSize is not null)
|
||||
flurlReq.SetQueryParam("page_size", request.PageSize.Value);
|
||||
|
||||
if (request.Page != null)
|
||||
if (request.Page is not null)
|
||||
flurlReq.SetQueryParam("page", request.Page.Value);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.AsyncTasksGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.AsyncTasksGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
#region Files
|
||||
@ -76,7 +76,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.SetQueryParam("task_id", request.TaskId)
|
||||
.SetQueryParam("file_id", request.FileId);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.AsyncTaskFilesGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.AsyncTaskFilesGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "campaigns", "add")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.CampaignsAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.CampaignsAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -44,7 +44,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "campaigns", "update")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.CampaignsUpdateResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.CampaignsUpdateResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -63,19 +63,19 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Get, "campaigns", "get")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
if (request.CampaignId != null)
|
||||
if (request.CampaignId is not null)
|
||||
flurlReq.SetQueryParam("campaign_id", request.CampaignId.Value);
|
||||
|
||||
if (request.Filters != null)
|
||||
if (request.Filters is not null)
|
||||
flurlReq.SetQueryParam("filtering", client.JsonSerializer.Serialize(request.Filters));
|
||||
|
||||
if (request.PageSize != null)
|
||||
if (request.PageSize is not null)
|
||||
flurlReq.SetQueryParam("page_size", request.PageSize.Value);
|
||||
|
||||
if (request.Page != null)
|
||||
if (request.Page is not null)
|
||||
flurlReq.SetQueryParam("page", request.Page.Value);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.CampaignsGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.CampaignsGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -27,13 +27,13 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.SetQueryParam("bill_year", request.BillYear)
|
||||
.SetQueryParam("bill_month", request.BillMonth);
|
||||
|
||||
if (request.PageSize != null)
|
||||
if (request.PageSize is not null)
|
||||
flurlReq.SetQueryParam("page_size", request.PageSize.Value);
|
||||
|
||||
if (request.Page != null)
|
||||
if (request.Page is not null)
|
||||
flurlReq.SetQueryParam("page", request.Page.Value);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.CreditBillsGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.CreditBillsGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "custom_audiences", "add")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.CustomAudiencesAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.CustomAudiencesAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -45,7 +45,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "custom_audiences", "update")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.CustomAudiencesUpdateResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.CustomAudiencesUpdateResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -64,16 +64,16 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Get, "custom_audiences", "get")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
if (request.CustomAudienceId != null)
|
||||
if (request.CustomAudienceId is not null)
|
||||
flurlReq.SetQueryParam("audience_id", request.CustomAudienceId.Value);
|
||||
|
||||
if (request.PageSize != null)
|
||||
if (request.PageSize is not null)
|
||||
flurlReq.SetQueryParam("page_size", request.PageSize.Value);
|
||||
|
||||
if (request.Page != null)
|
||||
if (request.Page is not null)
|
||||
flurlReq.SetQueryParam("page", request.Page.Value);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.CustomAudiencesGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.CustomAudiencesGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
#region Files
|
||||
@ -104,7 +104,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "custom_audience_files", "add")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestAsync<Models.CustomAudienceFilesAddResponse>(flurlReq, httpContent: httpContent, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsync<Models.CustomAudienceFilesAddResponse>(flurlReq, httpContent: httpContent, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -123,19 +123,19 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Get, "custom_audience_files", "get")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
if (request.CustomAudienceId != null)
|
||||
if (request.CustomAudienceId is not null)
|
||||
flurlReq.SetQueryParam("audience_id", request.CustomAudienceId.Value);
|
||||
|
||||
if (request.CustomAudienceFileId != null)
|
||||
if (request.CustomAudienceFileId is not null)
|
||||
flurlReq.SetQueryParam("custom_audience_file_id", request.CustomAudienceFileId.Value);
|
||||
|
||||
if (request.PageSize != null)
|
||||
if (request.PageSize is not null)
|
||||
flurlReq.SetQueryParam("page_size", request.PageSize.Value);
|
||||
|
||||
if (request.Page != null)
|
||||
if (request.Page is not null)
|
||||
flurlReq.SetQueryParam("page", request.Page.Value);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.CustomAudienceFilesGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.CustomAudienceFilesGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "estimation", "get")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.EstimationGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.EstimationGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "fund_transfer", "add")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.FundTransferAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.FundTransferAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -44,7 +44,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Get, "funds", "get")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.FundsGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.FundsGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -63,19 +63,19 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Get, "fund_statements_detailed", "get")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
if (request.DateRange != null)
|
||||
if (request.DateRange is not null)
|
||||
flurlReq.SetQueryParam("date_range", client.JsonSerializer.Serialize(request.DateRange));
|
||||
|
||||
if (request.TradeType != null)
|
||||
if (request.TradeType is not null)
|
||||
flurlReq.SetQueryParam("trade_type", request.TradeType);
|
||||
|
||||
if (request.PageSize != null)
|
||||
if (request.PageSize is not null)
|
||||
flurlReq.SetQueryParam("page_size", request.PageSize.Value);
|
||||
|
||||
if (request.Page != null)
|
||||
if (request.Page is not null)
|
||||
flurlReq.SetQueryParam("page", request.Page.Value);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.FundStatementsDetailedGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.FundStatementsDetailedGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -23,17 +23,17 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
if (client is null) throw new ArgumentNullException(nameof(client));
|
||||
if (request is null) throw new ArgumentNullException(nameof(request));
|
||||
|
||||
if (request.FileName == null)
|
||||
if (request.FileName is null)
|
||||
{
|
||||
request.FileName = Guid.NewGuid().ToString("N").ToLower();
|
||||
}
|
||||
|
||||
if (request.FileContentType == null)
|
||||
if (request.FileContentType is null)
|
||||
{
|
||||
request.FileContentType = Utilities.FileNameToContentTypeMapper.GetContentTypeForImage(request.FileName!) ?? "image/png";
|
||||
}
|
||||
|
||||
if (request.FileHash == null)
|
||||
if (request.FileHash is null)
|
||||
{
|
||||
request.FileHash = BitConverter.ToString(Utilities.MD5Utility.Hash(request.FileBytes ?? Array.Empty<byte>())).Replace("-", string.Empty);
|
||||
}
|
||||
@ -49,7 +49,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "images", "add")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestAsync<Models.ImagesAddResponse>(flurlReq, httpContent: httpContent, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsync<Models.ImagesAddResponse>(flurlReq, httpContent: httpContent, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -68,19 +68,19 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Get, "images", "get")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
if (request.ImageId != null)
|
||||
if (request.ImageId is not null)
|
||||
flurlReq.SetQueryParam("image_id", request.ImageId);
|
||||
|
||||
if (request.Filters != null)
|
||||
if (request.Filters is not null)
|
||||
flurlReq.SetQueryParam("filtering", client.JsonSerializer.Serialize(request.Filters));
|
||||
|
||||
if (request.PageSize != null)
|
||||
if (request.PageSize is not null)
|
||||
flurlReq.SetQueryParam("page_size", request.PageSize.Value);
|
||||
|
||||
if (request.Page != null)
|
||||
if (request.Page is not null)
|
||||
flurlReq.SetQueryParam("page", request.Page.Value);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.ImagesGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.ImagesGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "qualifications", "add")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.QualificationsAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.QualificationsAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -44,7 +44,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Get, "qualifications", "get")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.QualificationsGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.QualificationsGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -63,7 +63,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "qualifications", "delete")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.QualificationsDeleteResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.QualificationsDeleteResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -26,22 +26,22 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Get, "daily_reports", "get")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
if (request.DateRange != null)
|
||||
if (request.DateRange is not null)
|
||||
flurlReq.SetQueryParam("date_range", client.JsonSerializer.Serialize(request.DateRange));
|
||||
|
||||
if (request.ReportType != null)
|
||||
if (request.ReportType is not null)
|
||||
flurlReq.SetQueryParam("report_type", request.ReportType);
|
||||
|
||||
if (request.ReportLevel != null)
|
||||
if (request.ReportLevel is not null)
|
||||
flurlReq.SetQueryParam("level", request.ReportLevel);
|
||||
|
||||
if (request.PageSize != null)
|
||||
if (request.PageSize is not null)
|
||||
flurlReq.SetQueryParam("page_size", request.PageSize.Value);
|
||||
|
||||
if (request.Page != null)
|
||||
if (request.Page is not null)
|
||||
flurlReq.SetQueryParam("page", request.Page.Value);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.DailyReportsGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.DailyReportsGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -62,10 +62,10 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.SetQueryParam("date", request.DateString)
|
||||
.SetQueryParam("level", request.Level);
|
||||
|
||||
if (request.Filters != null && request.Filters.Any())
|
||||
if (request.Filters is not null && request.Filters.Any())
|
||||
flurlReq.SetQueryParam("filtering", client.JsonSerializer.Serialize(request.Filters));
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.RealtimeCostGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.RealtimeCostGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -25,7 +25,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Post, "sp_entrustment", "add")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.SpEntrustmentAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.SpEntrustmentAddResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -44,7 +44,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.CreateRequest(request, HttpMethod.Get, "sp_entrustment", "get")
|
||||
.SetQueryParam("access_token", request.AccessToken);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.SpEntrustmentGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.SpEntrustmentGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
.SetQueryParam("access_token", request.AccessToken)
|
||||
.SetQueryParam("type", request.TagType);
|
||||
|
||||
return await client.SendRequestWithJsonAsync<Models.TargetingTagsGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
return await client.SendFlurlRequestAsJsonAsync<Models.TargetingTagsGetResponse>(flurlReq, data: request, cancellationToken: cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,12 +1,13 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Flurl;
|
||||
using Flurl.Http;
|
||||
|
||||
namespace SKIT.FlurlHttpClient.Wechat.Ads.Interceptors
|
||||
{
|
||||
internal class WechatAdsRequestAgencyTokenInterceptor : FlurlHttpCallInterceptor
|
||||
internal class WechatAdsRequestAgencyTokenInterceptor : HttpInterceptor
|
||||
{
|
||||
private readonly string _agencyId;
|
||||
private readonly string _agencyApiKey;
|
||||
@ -17,18 +18,17 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads.Interceptors
|
||||
_agencyApiKey = agencyApiKey;
|
||||
}
|
||||
|
||||
public override async Task BeforeCallAsync(FlurlCall flurlCall)
|
||||
public override async Task BeforeCallAsync(HttpInterceptorContext context, CancellationToken cancellationToken = default)
|
||||
{
|
||||
if (flurlCall == null) throw new ArgumentNullException(nameof(flurlCall));
|
||||
if (flurlCall.Completed) throw new Exceptions.WechatAdsRequestAgencyTokenException("This interceptor must be called before request completed.");
|
||||
if (context is null) throw new ArgumentNullException(nameof(context));
|
||||
if (context.FlurlCall.Completed) throw new WechatAdsException("Failed to sign request. This interceptor must be called before request completed.");
|
||||
|
||||
string timestamp = DateTimeOffset.Now.ToLocalTime().ToUnixTimeSeconds().ToString();
|
||||
string nonce = Guid.NewGuid().ToString("N");
|
||||
string sign = Utilities.MD5Utility.Hash($"{_agencyId}{timestamp}{nonce}{_agencyApiKey}").ToLower();
|
||||
string token = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{_agencyId},{timestamp},{nonce},{sign}"));
|
||||
|
||||
flurlCall.Request.RemoveQueryParam("agency_token");
|
||||
flurlCall.Request.SetQueryParam("agency_token", token);
|
||||
context.FlurlCall.Request.SetQueryParam("agency_token", token);
|
||||
|
||||
await Task.Yield();
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
|
||||
{
|
||||
@ -24,14 +24,14 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
|
||||
/// </summary>
|
||||
[Newtonsoft.Json.JsonProperty("longitude")]
|
||||
[System.Text.Json.Serialization.JsonPropertyName("longitude")]
|
||||
public double Longitude { get; set; }
|
||||
public decimal Longitude { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置纬度。
|
||||
/// </summary>
|
||||
[Newtonsoft.Json.JsonProperty("latitude")]
|
||||
[System.Text.Json.Serialization.JsonPropertyName("latitude")]
|
||||
public double Latitude { get; set; }
|
||||
public decimal Latitude { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置半径(单位:米)。
|
||||
|
@ -30,14 +30,14 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
|
||||
/// </summary>
|
||||
[Newtonsoft.Json.JsonProperty("longitude")]
|
||||
[System.Text.Json.Serialization.JsonPropertyName("longitude")]
|
||||
public double Longitude { get; set; }
|
||||
public decimal Longitude { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置纬度。
|
||||
/// </summary>
|
||||
[Newtonsoft.Json.JsonProperty("latitude")]
|
||||
[System.Text.Json.Serialization.JsonPropertyName("latitude")]
|
||||
public double Latitude { get; set; }
|
||||
public decimal Latitude { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置半径(单位:米)。
|
||||
|
@ -60,7 +60,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
|
||||
/// </summary>
|
||||
[Newtonsoft.Json.JsonProperty("budget_reach_date")]
|
||||
[System.Text.Json.Serialization.JsonPropertyName("budget_reach_date")]
|
||||
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.NumericalStringConverter))]
|
||||
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.NumericalStringConverter))]
|
||||
public string? BudgetReachDateString { get; set; }
|
||||
|
||||
/// <summary>
|
||||
|
@ -1,3 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace SKIT.FlurlHttpClient.Wechat.Ads.Models.Abstractions
|
||||
{
|
||||
public abstract class CommonFilter
|
||||
@ -29,6 +31,6 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads.Models.Abstractions
|
||||
/// </summary>
|
||||
[Newtonsoft.Json.JsonProperty("values")]
|
||||
[System.Text.Json.Serialization.JsonPropertyName("values")]
|
||||
public string[] Values { get; set; } = new string[0];
|
||||
public IList<string> Values { get; set; } = new List<string>();
|
||||
}
|
||||
}
|
@ -68,18 +68,18 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
|
||||
/// 获取或设置最近修改时间戳。
|
||||
/// </summary>
|
||||
[Newtonsoft.Json.JsonProperty("last_modified_time")]
|
||||
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RegularDateTimeOffsetConverter))]
|
||||
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.BasicDateTimeOffsetConverter))]
|
||||
[System.Text.Json.Serialization.JsonPropertyName("last_modified_time")]
|
||||
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RegularDateTimeOffsetConverter))]
|
||||
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.BasicDateTimeOffsetConverter))]
|
||||
public DateTimeOffset UpdateTime { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置创建时间戳。
|
||||
/// </summary>
|
||||
[Newtonsoft.Json.JsonProperty("created_time")]
|
||||
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RegularDateTimeOffsetConverter))]
|
||||
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.BasicDateTimeOffsetConverter))]
|
||||
[System.Text.Json.Serialization.JsonPropertyName("created_time")]
|
||||
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RegularDateTimeOffsetConverter))]
|
||||
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.BasicDateTimeOffsetConverter))]
|
||||
public DateTimeOffset CreateTime { get; set; }
|
||||
}
|
||||
|
||||
|
@ -96,9 +96,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads.Models
|
||||
/// 获取或设置创建时间戳。
|
||||
/// </summary>
|
||||
[Newtonsoft.Json.JsonProperty("created_time")]
|
||||
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.RegularDateTimeOffsetConverter))]
|
||||
[Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.Common.BasicDateTimeOffsetConverter))]
|
||||
[System.Text.Json.Serialization.JsonPropertyName("created_time")]
|
||||
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Converters.RegularDateTimeOffsetConverter))]
|
||||
[System.Text.Json.Serialization.JsonConverter(typeof(System.Text.Json.Serialization.Common.BasicDateTimeOffsetConverter))]
|
||||
public DateTimeOffset CreateTime { get; set; }
|
||||
}
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>net461; netstandard2.0; net6.0</TargetFrameworks>
|
||||
<LangVersion>8.0</LangVersion>
|
||||
<LangVersion>10.0</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
<NullableReferenceTypes>true</NullableReferenceTypes>
|
||||
</PropertyGroup>
|
||||
@ -14,7 +14,7 @@
|
||||
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||
<PackageProjectUrl>https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat</PackageProjectUrl>
|
||||
<PackageTags>Flurl.Http Wechat Weixin MicroMessage WechatAds WechatAdvertisting 微信 广告平台 微信广告平台 腾讯广告平台 广点通 微信广点通 腾讯广点通</PackageTags>
|
||||
<Version>2.0.0</Version>
|
||||
<Version>3.0.0-preview.1</Version>
|
||||
<Description>基于 Flurl.Http 的微信广告平台(广点通)API 客户端。</Description>
|
||||
<Authors>Fu Diwei</Authors>
|
||||
<RepositoryType>git</RepositoryType>
|
||||
@ -40,7 +40,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="SKIT.FlurlHttpClient.Common" Version="2.6.0" />
|
||||
<PackageReference Include="SKIT.FlurlHttpClient.Common" Version="3.0.0-preview.1" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
|
||||
namespace SKIT.FlurlHttpClient.Wechat.Ads.Settings
|
||||
{
|
||||
@ -21,7 +21,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads.Settings
|
||||
|
||||
internal Credentials(WechatAdsClientOptions options)
|
||||
{
|
||||
if (options == null) throw new ArgumentNullException(nameof(options));
|
||||
if (options is null) throw new ArgumentNullException(nameof(options));
|
||||
|
||||
AgencyId = options.AgencyId;
|
||||
AgencyAppId = options.AgencyAppId;
|
||||
|
@ -16,7 +16,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads.Utilities
|
||||
/// <returns>信息摘要字节数组。</returns>
|
||||
public static byte[] Hash(byte[] bytes)
|
||||
{
|
||||
if (bytes == null) throw new ArgumentNullException(nameof(bytes));
|
||||
if (bytes is null) throw new ArgumentNullException(nameof(bytes));
|
||||
|
||||
using MD5 md5 = MD5.Create();
|
||||
return md5.ComputeHash(bytes);
|
||||
@ -29,7 +29,7 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads.Utilities
|
||||
/// <returns>信息摘要。</returns>
|
||||
public static string Hash(string message)
|
||||
{
|
||||
if (message == null) throw new ArgumentNullException(nameof(message));
|
||||
if (message is null) throw new ArgumentNullException(nameof(message));
|
||||
|
||||
byte[] msgBytes = Encoding.UTF8.GetBytes(message);
|
||||
byte[] hashBytes = Hash(msgBytes);
|
||||
|
@ -21,14 +21,25 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
/// </summary>
|
||||
/// <param name="options">配置项。</param>
|
||||
public WechatAdsClient(WechatAdsClientOptions options)
|
||||
: base()
|
||||
: this(options, null)
|
||||
{
|
||||
if (options == null) throw new ArgumentNullException(nameof(options));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="options"></param>
|
||||
/// <param name="httpClient"></param>
|
||||
/// <param name="disposeClient"></param>
|
||||
internal protected WechatAdsClient(WechatAdsClientOptions options, HttpClient? httpClient, bool disposeClient = true)
|
||||
: base(httpClient, disposeClient)
|
||||
{
|
||||
if (options is null) throw new ArgumentNullException(nameof(options));
|
||||
|
||||
Credentials = new Settings.Credentials(options);
|
||||
|
||||
FlurlClient.BaseUrl = options.Endpoint ?? WechatAdsEndpoints.DEFAULT;
|
||||
FlurlClient.WithTimeout(TimeSpan.FromMilliseconds(options.Timeout));
|
||||
FlurlClient.WithTimeout(options.Timeout <= 0 ? Timeout.InfiniteTimeSpan : TimeSpan.FromMilliseconds(options.Timeout));
|
||||
|
||||
Interceptors.Add(new Interceptors.WechatAdsRequestAgencyTokenInterceptor(
|
||||
agencyId: options.AgencyId,
|
||||
@ -36,34 +47,18 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 用指定的微信广告平台服务商 ID、微信广告平台服务商 AppId、微信广告平台服务商 ApiKey 初始化 <see cref="WechatAdsClient"/> 类的新实例。
|
||||
/// </summary>
|
||||
/// <param name="agencyId">微信广告平台服务商 ID。</param>
|
||||
/// <param name="agencyAppId">微信广告平台服务商 AppId。</param>
|
||||
/// <param name="agencyApiKey">微信广告平台服务商 ApiKey。</param>
|
||||
public WechatAdsClient(string agencyId, string agencyAppId, string agencyApiKey)
|
||||
: this(new WechatAdsClientOptions() { AgencyId = agencyId, AgencyAppId = agencyAppId, AgencyApiKey = agencyApiKey })
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 使用当前客户端生成一个新的 <see cref="IFlurlRequest"/> 对象。
|
||||
/// </summary>
|
||||
/// <param name="request"></param>
|
||||
/// <param name="method"></param>
|
||||
/// <param name="httpMethod"></param>
|
||||
/// <param name="urlSegments"></param>
|
||||
/// <returns></returns>
|
||||
public IFlurlRequest CreateRequest(WechatAdsRequest request, HttpMethod method, params object[] urlSegments)
|
||||
public IFlurlRequest CreateRequest(WechatAdsRequest request, HttpMethod httpMethod, params object[] urlSegments)
|
||||
{
|
||||
IFlurlRequest flurlRequest = FlurlClient.Request(urlSegments).WithVerb(method);
|
||||
IFlurlRequest flurlRequest = base.CreateFlurlRequest(request, httpMethod, urlSegments);
|
||||
|
||||
if (request.Timeout != null)
|
||||
{
|
||||
flurlRequest.WithTimeout(TimeSpan.FromMilliseconds(request.Timeout.Value));
|
||||
}
|
||||
|
||||
if (request.Version != null)
|
||||
if (request.Version is not null)
|
||||
{
|
||||
flurlRequest.SetQueryParam("version", request.Version);
|
||||
}
|
||||
@ -79,24 +74,13 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
/// <param name="httpContent"></param>
|
||||
/// <param name="cancellationToken"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<T> SendRequestAsync<T>(IFlurlRequest flurlRequest, HttpContent? httpContent = null, CancellationToken cancellationToken = default)
|
||||
public async Task<T> SendFlurlRequestAsync<T>(IFlurlRequest flurlRequest, HttpContent? httpContent = null, CancellationToken cancellationToken = default)
|
||||
where T : WechatAdsResponse, new()
|
||||
{
|
||||
if (flurlRequest == null) throw new ArgumentNullException(nameof(flurlRequest));
|
||||
if (flurlRequest is null) throw new ArgumentNullException(nameof(flurlRequest));
|
||||
|
||||
try
|
||||
{
|
||||
using IFlurlResponse flurlResponse = await base.SendRequestAsync(flurlRequest, httpContent, cancellationToken);
|
||||
return await WrapResponseWithJsonAsync<T>(flurlResponse, cancellationToken);
|
||||
}
|
||||
catch (FlurlHttpTimeoutException ex)
|
||||
{
|
||||
throw new Exceptions.WechatAdsRequestTimeoutException(ex.Message, ex);
|
||||
}
|
||||
catch (FlurlHttpException ex)
|
||||
{
|
||||
throw new WechatAdsException(ex.Message, ex);
|
||||
}
|
||||
using IFlurlResponse flurlResponse = await base.SendFlurlRequestAsync(flurlRequest, httpContent, cancellationToken);
|
||||
return await base.WrapFlurlResponseAsJsonAsync<T>(flurlResponse, cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -107,30 +91,19 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
/// <param name="data"></param>
|
||||
/// <param name="cancellationToken"></param>
|
||||
/// <returns></returns>
|
||||
public async Task<T> SendRequestWithJsonAsync<T>(IFlurlRequest flurlRequest, object? data = null, CancellationToken cancellationToken = default)
|
||||
public async Task<T> SendFlurlRequestAsJsonAsync<T>(IFlurlRequest flurlRequest, object? data = null, CancellationToken cancellationToken = default)
|
||||
where T : WechatAdsResponse, new()
|
||||
{
|
||||
if (flurlRequest == null) throw new ArgumentNullException(nameof(flurlRequest));
|
||||
if (flurlRequest is null) throw new ArgumentNullException(nameof(flurlRequest));
|
||||
|
||||
try
|
||||
{
|
||||
bool isSimpleRequest = data == null ||
|
||||
flurlRequest.Verb == HttpMethod.Get ||
|
||||
flurlRequest.Verb == HttpMethod.Head ||
|
||||
flurlRequest.Verb == HttpMethod.Options;
|
||||
using IFlurlResponse flurlResponse = isSimpleRequest ?
|
||||
await base.SendRequestAsync(flurlRequest, null, cancellationToken) :
|
||||
await base.SendRequestWithJsonAsync(flurlRequest, data, cancellationToken);
|
||||
return await WrapResponseWithJsonAsync<T>(flurlResponse, cancellationToken);
|
||||
}
|
||||
catch (FlurlHttpTimeoutException ex)
|
||||
{
|
||||
throw new Exceptions.WechatAdsRequestTimeoutException(ex.Message, ex);
|
||||
}
|
||||
catch (FlurlHttpException ex)
|
||||
{
|
||||
throw new WechatAdsException(ex.Message, ex);
|
||||
}
|
||||
bool isSimpleRequest = data is null ||
|
||||
flurlRequest.Verb == HttpMethod.Get ||
|
||||
flurlRequest.Verb == HttpMethod.Head ||
|
||||
flurlRequest.Verb == HttpMethod.Options;
|
||||
using IFlurlResponse flurlResponse = isSimpleRequest ?
|
||||
await base.SendFlurlRequestAsync(flurlRequest, null, cancellationToken) :
|
||||
await base.SendFlurlRequestAsJsonAsync(flurlRequest, data, cancellationToken);
|
||||
return await base.WrapFlurlResponseAsJsonAsync<T>(flurlResponse, cancellationToken);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -7,13 +7,17 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取或设置请求超时时间(单位:毫秒)。
|
||||
/// <para>默认值:30000</para>
|
||||
/// <para>
|
||||
/// 默认值:30000
|
||||
/// </para>
|
||||
/// </summary>
|
||||
public int Timeout { get; set; } = 30 * 1000;
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置微信广告平台 API 入口点。
|
||||
/// <para>默认值:<see cref="WechatAdsEndpoints.DEFAULT"/></para>
|
||||
/// <para>
|
||||
/// 默认值:<see cref="WechatAdsEndpoints.DEFAULT"/>
|
||||
/// </para>
|
||||
/// </summary>
|
||||
public string Endpoint { get; set; } = WechatAdsEndpoints.DEFAULT;
|
||||
|
||||
|
@ -1,11 +1,11 @@
|
||||
using System;
|
||||
using System;
|
||||
|
||||
namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信广告平台 API 出错时引发的异常。
|
||||
/// </summary>
|
||||
public class WechatAdsException : CommonExceptionBase
|
||||
public class WechatAdsException : CommonException
|
||||
{
|
||||
/// <inheritdoc/>
|
||||
public WechatAdsException()
|
||||
|
@ -3,15 +3,8 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
/// <summary>
|
||||
/// 微信广告平台 API 请求的基类。
|
||||
/// </summary>
|
||||
public abstract class WechatAdsRequest : ICommonRequest
|
||||
public abstract class WechatAdsRequest : CommonRequestBase, ICommonRequest
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取或设置请求超时时间(单位:毫秒)。如果不指定将使用构造 <see cref="WechatAdsClient"/> 时的 <see cref="WechatAdsClientOptions.Timeout"/> 参数,这在需要指定特定耗时请求(比如上传或下载文件)的超时时间时很有用。
|
||||
/// </summary>
|
||||
[Newtonsoft.Json.JsonIgnore]
|
||||
[System.Text.Json.Serialization.JsonIgnore]
|
||||
public virtual int? Timeout { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置微信广告平台的 AccessToken。
|
||||
/// </summary>
|
||||
@ -21,7 +14,9 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
|
||||
/// <summary>
|
||||
/// 获取或设置微信广告平台的版本号。
|
||||
/// <para>默认值:"v1.0"</para>
|
||||
/// <para>
|
||||
/// 默认值:"v1.0"
|
||||
/// </para>
|
||||
/// </summary>
|
||||
[Newtonsoft.Json.JsonIgnore]
|
||||
[System.Text.Json.Serialization.JsonIgnore]
|
||||
|
@ -1,60 +1,10 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信广告平台 API 响应的基类。
|
||||
/// </summary>
|
||||
public abstract class WechatAdsResponse : ICommonResponse
|
||||
public abstract class WechatAdsResponse : CommonResponseBase, ICommonResponse
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
int ICommonResponse.RawStatus { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
IDictionary<string, string> ICommonResponse.RawHeaders { get; set; } = default!;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
byte[] ICommonResponse.RawBytes { get; set; } = default!;
|
||||
|
||||
/// <summary>
|
||||
/// 获取原始的 HTTP 响应状态码。
|
||||
/// </summary>
|
||||
[Newtonsoft.Json.JsonIgnore]
|
||||
[System.Text.Json.Serialization.JsonIgnore]
|
||||
public int RawStatus
|
||||
{
|
||||
get { return ((ICommonResponse)this).RawStatus; }
|
||||
internal set { ((ICommonResponse)this).RawStatus = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取原始的 HTTP 响应表头集合。
|
||||
/// </summary>
|
||||
[Newtonsoft.Json.JsonIgnore]
|
||||
[System.Text.Json.Serialization.JsonIgnore]
|
||||
public IDictionary<string, string> RawHeaders
|
||||
{
|
||||
get { return ((ICommonResponse)this).RawHeaders; }
|
||||
internal set { ((ICommonResponse)this).RawHeaders = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取原始的 HTTP 响应正文。
|
||||
/// </summary>
|
||||
[Newtonsoft.Json.JsonIgnore]
|
||||
[System.Text.Json.Serialization.JsonIgnore]
|
||||
public byte[] RawBytes
|
||||
{
|
||||
get { return ((ICommonResponse)this).RawBytes; }
|
||||
internal set { ((ICommonResponse)this).RawBytes = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取微信广告平台 API 返回的错误码。
|
||||
/// </summary>
|
||||
@ -70,12 +20,15 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads
|
||||
public virtual string? ErrorMessage { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 获取一个值,该值指示调用微信广告平台 API 是否成功(即 HTTP 状态码为 200、且 errcode 值为 0)。
|
||||
/// 获取一个值,该值指示调用微信广告平台 API 是否成功。
|
||||
/// <para>
|
||||
///(即 HTTP 状态码为 200,且 <see cref="ErrorCode"/> 值为 0)
|
||||
/// </para>
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public virtual bool IsSuccessful()
|
||||
public override bool IsSuccessful()
|
||||
{
|
||||
return RawStatus == 200 && ErrorCode == 0;
|
||||
return GetRawStatus() == 200 && ErrorCode == 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,51 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using SKIT.FlurlHttpClient.Tools.CodeAnalyzer;
|
||||
using Xunit;
|
||||
|
||||
namespace SKIT.FlurlHttpClient.Wechat.Ads.UnitTests
|
||||
{
|
||||
public class CodeAnalyzeTests
|
||||
{
|
||||
[Fact(DisplayName = "代码质量分析")]
|
||||
public void TestCodeAnalyzer()
|
||||
{
|
||||
Assert.Null(Record.Exception(() =>
|
||||
{
|
||||
var options = new TypeDeclarationAnalyzerOptions()
|
||||
{
|
||||
SdkAssembly = Assembly.GetAssembly(typeof(WechatAdsClient))!,
|
||||
SdkRequestModelDeclarationNamespace = "SKIT.FlurlHttpClient.Wechat.Ads.Models",
|
||||
SdkResponseModelDeclarationNamespace = "SKIT.FlurlHttpClient.Wechat.Ads.Models",
|
||||
SdkExecutingExtensionDeclarationNamespace = "SKIT.FlurlHttpClient.Wechat.Ads",
|
||||
ThrowOnNotFoundRequestModelTypes = true,
|
||||
ThrowOnNotFoundResponseModelTypes = true,
|
||||
ThrowOnNotFoundExecutingExtensionTypes = true
|
||||
};
|
||||
new TypeDeclarationAnalyzer(options).AssertNoIssues();
|
||||
}));
|
||||
|
||||
Assert.Null(Record.Exception(() =>
|
||||
{
|
||||
string workdir = Environment.CurrentDirectory;
|
||||
string projdir = Path.Combine(workdir, "../../../../../");
|
||||
|
||||
var options = new SourceFileAnalyzerOptions()
|
||||
{
|
||||
SdkAssembly = Assembly.GetAssembly(typeof(WechatAdsClient))!,
|
||||
SdkRequestModelDeclarationNamespace = "SKIT.FlurlHttpClient.Wechat.Ads.Models",
|
||||
SdkResponseModelDeclarationNamespace = "SKIT.FlurlHttpClient.Wechat.Ads.Models",
|
||||
ProjectSourceRootDirectory = Path.Combine(projdir, "./src/SKIT.FlurlHttpClient.Wechat.Ads/"),
|
||||
ProjectTestRootDirectory = Path.Combine(projdir, "./test/SKIT.FlurlHttpClient.Wechat.Ads.UnitTests/"),
|
||||
ThrowOnNotFoundRequestModelClassCodeFiles = true,
|
||||
ThrowOnNotFoundResponseModelClassCodeFiles = true,
|
||||
ThrowOnNotFoundExecutingExtensionClassCodeFiles = true,
|
||||
ThrowOnNotFoundRequestModelSerializationSampleFiles = true,
|
||||
ThrowOnNotFoundResponseModelSerializationSampleFiles = true
|
||||
};
|
||||
new SourceFileAnalyzer(options).AssertNoIssues();
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
@ -11,21 +11,21 @@
|
||||
<ItemGroup>
|
||||
<None Remove=".gitignore" />
|
||||
<Content Include="appsettings.json">
|
||||
<CopyToOutputDirectory>Never</CopyToOutputDirectory>
|
||||
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
|
||||
</Content>
|
||||
<Content Include="appsettings.*.json" Condition="'$(Configuration)' == 'Debug'">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||
</Content>
|
||||
<Content Include="appsettings.*.json" Condition="'$(Configuration)' == 'Debug'">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
<CopyToPublishDirectory>Always</CopyToPublishDirectory>
|
||||
</Content>
|
||||
<Content Include="ModelSamples/**/*.json" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.4.0" />
|
||||
<PackageReference Include="SKIT.FlurlHttpClient.Tools.CodeAnalyzer" Version="0.1.0-alpha.1" />
|
||||
<PackageReference Include="xunit" Version="2.4.2" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
|
||||
<PackageReference Include="SKIT.FlurlHttpClient.Tools.CodeAnalyzer" Version="0.3.0-preview.1" />
|
||||
<PackageReference Include="xunit" Version="2.6.6" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.6">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
|
@ -1,28 +0,0 @@
|
||||
using SKIT.FlurlHttpClient.Tools.CodeAnalyzer;
|
||||
using Xunit;
|
||||
|
||||
namespace SKIT.FlurlHttpClient.Wechat.Ads.UnitTests
|
||||
{
|
||||
public class TestCase_CodeReview
|
||||
{
|
||||
[Fact(DisplayName = "测试用例:代码质量分析")]
|
||||
public void TestCodeAnalyzer()
|
||||
{
|
||||
Assert.Null(Record.Exception(() =>
|
||||
{
|
||||
CodeAnalyzerOptions options = new CodeAnalyzerOptions()
|
||||
{
|
||||
AssemblyName = "SKIT.FlurlHttpClient.Wechat.Ads",
|
||||
WorkDirectoryForSourceCode = TestConfigs.WorkDirectoryForSdk,
|
||||
WorkDirectoryForTestSample = TestConfigs.WorkDirectoryForTest,
|
||||
AllowNotFoundEventTypes = true,
|
||||
AllowNotFoundEventSamples = true
|
||||
};
|
||||
CodeAnalyzer analyzer = new CodeAnalyzer(options);
|
||||
analyzer.Start();
|
||||
analyzer.Assert();
|
||||
analyzer.Flush();
|
||||
}));
|
||||
}
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
using System;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Text.Json;
|
||||
|
||||
@ -17,14 +17,11 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads.UnitTests
|
||||
using var stream = File.OpenRead("appsettings.local.json");
|
||||
using var jdoc = JsonDocument.Parse(stream);
|
||||
|
||||
var config = jdoc.RootElement.GetProperty("TestConfig");
|
||||
var config = jdoc.RootElement.GetProperty("TestConfigs");
|
||||
WechatAgencyId = config.GetProperty("AgencyId").GetString()!;
|
||||
WechatAgencyAppId = config.GetProperty("AgencyAppId").GetString()!;
|
||||
WechatAgencyApiKey = config.GetProperty("AgencyApiKey").GetString()!;
|
||||
WechatAccessToken = config.GetProperty("AccessToken").GetString()!;
|
||||
|
||||
WorkDirectoryForSdk = jdoc.RootElement.GetProperty("WorkDirectoryForSdk").GetString()!;
|
||||
WorkDirectoryForTest = jdoc.RootElement.GetProperty("WorkDirectoryForTest").GetString()!;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@ -36,8 +33,5 @@ namespace SKIT.FlurlHttpClient.Wechat.Ads.UnitTests
|
||||
public static readonly string WechatAgencyAppId;
|
||||
public static readonly string WechatAgencyApiKey;
|
||||
public static readonly string WechatAccessToken;
|
||||
|
||||
public static readonly string WorkDirectoryForSdk;
|
||||
public static readonly string WorkDirectoryForTest;
|
||||
}
|
||||
}
|
||||
|
@ -1,10 +1,8 @@
|
||||
{
|
||||
"TestConfig": {
|
||||
{
|
||||
"TestConfigs": {
|
||||
"AgencyId": "请在此填写用于测试的微信广告 AgencyId",
|
||||
"AgencyAppId": "请在此填写用于测试的微信广告 AgencyAppId",
|
||||
"AgencyApiKey": "请在此填写用于测试的微信广告 AgencyApiKey",
|
||||
"AccessToken": "请在此填写用于测试的微信广告 AccessToken"
|
||||
},
|
||||
"WorkDirectoryForSdk": "请输入当前 SDK 项目所在的目录完整路径,如 C:\\Project\\src\\SKIT.FlurlHttpClient.Wechat.Ads\\",
|
||||
"WorkDirectoryForTest": "请输入当前测试项目所在的目录完整路径,如 C:\\Project\\test\\SKIT.FlurlHttpClient.Wechat.Ads.UnitTests\\"
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user