在我看来,在尝试使用WebApi POST方法时,RestSharp客户端发生了一些奇怪的事情。下面的代码分别用于服务器(WebApi)和客户端。
服务器WebApi
[Route("UserRoles")]
[AllowAnonymous]
public IHttpActionResult Post(
[FromBody] UserroleDto userroleDto,
[FromUri] string appCode)
{
return OK();
}和测试客户端
[TestInitialize()]
public void Initialize()
{
_restClient = new RestClient("http://localhost:8089");
}
[TestMethod]
public void Can_Store_A_Userrole_Via_REST_WebAPI()
{
var request = new RestRequest(ApiBasePath, Method.POST);
request.AddUrlSegment("segment", "UserRoles");
request.RequestFormat = DataFormat.Json;
request.AddBody(
new UserroleDto()
{
UserRoleId = -1,
Role = "Developer"
});
request.AddHeader("appCode", AppCode);
//request.AddParameter("appCode", AppCode);
_restClient.Execute(request);
}设想方案如下:
[FromUri] string appCode和测试中的request.AddParameter("appCode", AppCode);,那么测试就通过了。[FromUri] string appCode包含在POST方法中,并且从POSTMAN运行该方法,则测试通过。[FromUri] string appCode和测试中的request.AddParameter("appCode", AppCode);分别包括在内,则测试失败。错误消息:在Controller上找不到方法任何建议都是非常欢迎的!
发布于 2015-11-20 19:23:20
首先,我将解释一下您的场景中有经验的行为。然后我会提供一个解决方案。
在这个场景中,服务器不会期望appCode出现在任何地方,而且测试也不会发送它。测试似乎通过了,但我认为这是一个假阳性。服务器根本没有接收到appCode!
我猜你在邮递员中使用这个网址:
http://localhost:8089/UserRoles?appCode=SomeAppCode在这个场景中,ASP.NET Web从appCode中提取appCode,从主体中提取DTO。然后,服务器方法按预期执行。
这个失败的原因是appCode被添加到主体中。但是,服务器希望它在uri中。因此,框架无法找到与uri匹配并抛出所述错误的方法。
溶液
如果可以的话,我会改变路线和你的行动:
[Route("UserRoles/{appCode}"]
[AllowAnonymous]
public IHttpActionResult Post(string appCode, UserroleDto userroleDto)
{
return OK();
}通过此更改,url将变成:
http://localhost:8089/UserRoles/SomeAppCode可以把身体放进身体里。
那么,您的测试代码将是:
[TestMethod]
public void Can_Store_A_Userrole_Via_REST_WebAPI()
{
var request = new RestRequest(ApiBasePath, Method.POST);
request.AddUrlSegment("segment", "UserRoles");
request.AddUrlSegment("segment", AppCode);
request.RequestFormat = DataFormat.Json;
request.AddBody(
new UserroleDto()
{
UserRoleId = -1,
Role = "Developer"
});
_restClient.Execute(request);
}发布于 2015-11-20 18:49:35
对你实验的行为的解释
如果没有FromUri,控制器希望通过请求体接收AppCode,这正是RestSharp.AddParameter()实际上所做的。考试合格,一切顺利!
在这里,您可能使用POSTMAN调用适当的url,其中包含一个查询参数。测试合格,如果您正在查询的url有您期望的签名,那么一切都很好。
在这里,它失败了,因为控制器期望以查询param的形式接收AppCode。(就像你和邮递员一起做的那样)但是通过使用RestSharp.AddParameter(),您可能没有将查询发送到正确的url,因此出现了错误。
如何解决问题:定义api路由
你必须定义的是我的路线应该是什么样子?
另一个问题是,人们可以说我想如何查询我的api?
选项1:使用查询参数
FromUri将定义控制器,因此它将响应请求,如下所示:
localhost:8099/UserRoles?appcode=appcode
如果这是您希望您的api拥有的url,则可以相应地使用RestSharp:
var myAppCode="FOO"; var url = "localhost:8099/UserRoles?appCode={appCodeToQuery}"; request.addUrlSegment("appCodeToQuery",myAppCode);
备选方案2:使用POST主体
您可以为您的api路由选择另一种样式,如:
本地主机:8099/UserRoles。
因此,可以使用POST的请求体传递一些数据,如下所示:
var myAppCode="FOO"; request.addParameter("appCode",myAppCode);
它应该通过请求体发布数据。
选项3:使用请求头
此外,我怀疑您是否希望在头文件中传递appCode。如果您调用它,RestSharp将这样做:
request.AddHeader("appCode", AppCode);
其他选择?
是的,还有其他可以将数据发送到API的选项。您将使用RestSharp进行的测试需要适合您的控制器实际实现的功能。
https://stackoverflow.com/questions/33829292
复制相似问题