Hi guys
I created an api like
[HttpGet]
[Route("dx/[action]")]
public virtual Task<LoadResult> GetDxListAsync(DataSourceLoadOptionsBase input)//[FromBody]
{
return _mailsAppService.GetDxListAsync(input);
}
There is a complex parameter(DataSourceLoadOptionsBase ) in my API. and generate a static client. but"Volo.Abp.Http.Client.ClientProxying" didn't handle it well.
then i found that in v5.0. there is a way to handle it myself. github so I add those code in my service's Httpapi.client
//in OaServiceHttpApiClientModule
Configure<AbpHttpClientProxyingOptions>(options =>
{
options.QueryStringConverts.Add(typeof(DataSourceLoadOptionsBase), typeof(DataSourceLoadOptionsBaseToQueryString));
});
//static
context.Services.AddStaticHttpClientProxies(
typeof(OaServiceApplicationContractsModule).Assembly
);
//DataSourceLoadOptionsBaseToQueryString.cs
public class DataSourceLoadOptionsBaseToQueryString : IObjectToQueryString<DataSourceLoadOptionsBase>, ITransientDependency
{
public Task<string> ConvertAsync(DataSourceLoadOptionsBase values)
{
if (values==null)
{
return null;
}
return Task.FromResult("12345678");
}
}
but after i called the method "GetDxListAsync" in my blazor client nothing happened.
is there someone can help me?
20 Answer(s)
-
0
hi
Is your project tiered?
DataSourceLoadOptionsBaseToQueryString : IObjectToQueryString<DataSourceLoadOptionsBase >
-
0
Hi maiiming My project is a Microservice Solution
-
0
hi
Try to configure it in your blazor project?
Configure(options => { options.QueryStringConverts.Add(typeof(DataSourceLoadOptionsBase), typeof(DataSourceLoadOptionsBaseToQueryString)); });
-
0
In main blazor or in my service blazor?
-
0
Please share your project structure.
-
0
-
0
hi
I think you should add it in your
apps
projects. -
0
got it after I try it, I will send feedback.
-
0
OK : )
-
0
-
0
hi
Can you try to reproduce this in a brand new **Microservice **project? liming.ma@volosoft.com
-
0
My Microservice project is created in v5.0 rc and I just updated it to v5.0 and just add one entity to it。
I will creat Microservice project to test it.
-
0
public virtual Task GetDxListAsync(DataSourceLoadOptionsBase input)//[FromBody]
Is this bind from the querystring?
-
0
Yes.
problem is that the method doesn't work. I can get data from my api but if this method is working then the blazor client should request a URL like HTTP://remotehost/action?123445678.
public class DataSourceLoadOptionsBaseToQueryString : IObjectToQueryString, ITransientDependency { public Task ConvertAsync(DataSourceLoadOptionsBase values) { if (values==null) { return null; } return Task.FromResult("12345678"); } }
i set a Breakpoint in the method but it was not hitted
///////////////////////////////////////////////////////////////////// //url should like this at the end. ?requireTotalCount=true&take=10&totalSummary=[{"Selector":"SendTime","SummaryType":"count"}]
but //now the httpclient get the wrong url. ?requireTotalCount=true&take=10&totalSummary=Devextrem.asp.net.summaryinfo
so I want to use QueryStringConverts to fix that.
-
0
https://zoom.us/j/97027636243?pwd=ZHNySmlocFl5enJUNVBzTnZqaGdVZz09
-
0
hi maliming 增加转换器后
Configure<AbpHttpClientProxyingOptions>(options => { options.QueryStringConverts.Add(typeof(DataSourceLoadOptionsBase), typeof(DataSourceLoadOptionsBaseToQueryString)); options.QueryStringConverts.Add(typeof(SummaryInfo[]), typeof(DataSourceLoadOptionsBaseSummaryInfoToQueryString)); });
DataSourceLoadOptionsBase 不会进行转换 但是SummaryInfo 可以 为什么?
-
0
因为
DataSourceLoadOptionsBase
不作为参数,SummaryInfo
是参数, 具体你看JSON的内容就知道了. -
0
@mailming 谢谢 筛选器已经可以使用了 但是有个问题 DataSourceLoadOptionsBase 中有2个属性都是SummaryInfo 类型的 用转换器的话只能添加一个类型, SummaryInfo a; SummaryInfo b; ulr只能像这样 “xxx/xxxx/a=[SummaryInfo ]”或者 “xxx/xxxx/a=[SummaryInfo ]” 有办法把在转换事件中获取属性名称吗?或者更改下转换器 在调用时将属性名称传入 或者接受自定义?
另外 如果我把API 更改成POST方法 是否可以把DataSourceLoadOptionsBase 直接传递给接口?
-
0
- 你可以重写ClientProxyUrlBuilder服务. 下个版本会考虑. https://github.com/abpframework/abp/issues/11047
- Post会尝试对
DataSourceLoadOptionsBase
进行JSON序列化
-
0
非常感谢