Hi guys
I created an api like
[HttpGet]
[Route("dx/[action]")]
public virtual Task 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(options =>
{
options.QueryStringConverts.Add(typeof(DataSourceLoadOptionsBase), typeof(DataSourceLoadOptionsBaseToQueryString));
});
//static
context.Services.AddStaticHttpClientProxies(
typeof(OaServiceApplicationContractsModule).Assembly
);
//DataSourceLoadOptionsBaseToQueryString.cs
public class DataSourceLoadOptionsBaseToQueryString : IObjectToQueryString, ITransientDependency
{
public Task 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
main folder
services
apps
-
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
HI maliming
it doesn't work. -
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.summaryinfoso I want to use QueryStringConverts to fix that.
-
0
-
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
非常感谢