首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Web失败添加了FromUri参数和RestSharp

Web失败添加了FromUri参数和RestSharp
EN

Stack Overflow用户
提问于 2015-11-20 14:36:07
回答 2查看 3K关注 0票数 3

在我看来,在尝试使用WebApi POST方法时,RestSharp客户端发生了一些奇怪的事情。下面的代码分别用于服务器(WebApi)和客户端。

服务器WebApi

代码语言:javascript
复制
[Route("UserRoles")]
[AllowAnonymous]
public IHttpActionResult Post(
    [FromBody] UserroleDto userroleDto,
    [FromUri] string appCode)
{
  return OK();
}

测试客户端

代码语言:javascript
复制
[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);
}

设想方案如下:

  1. 如果我注释掉POST方法中的[FromUri] string appCode和测试中的request.AddParameter("appCode", AppCode);,那么测试就通过了。
  2. 如果我将[FromUri] string appCode包含在POST方法中,并且从POSTMAN运行该方法,则测试通过。
  3. 如果将POST方法中的[FromUri] string appCode和测试中的request.AddParameter("appCode", AppCode);分别包括在内,则测试失败。错误消息:在Controller上找不到方法

任何建议都是非常欢迎的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-20 19:23:20

首先,我将解释一下您的场景中有经验的行为。然后我会提供一个解决方案。

  1. 如果我注释掉POST方法中的FromUri字符串appCode和request.AddParameter("appCode",AppCode),那么测试就通过了。

在这个场景中,服务器不会期望appCode出现在任何地方,而且测试也不会发送它。测试似乎通过了,但我认为这是一个假阳性。服务器根本没有接收到appCode

  1. 如果我在POST方法中包含FromUri字符串appCode,并且从POSTMAN运行该方法,则测试通过。

我猜你在邮递员中使用这个网址:

代码语言:javascript
复制
http://localhost:8089/UserRoles?appCode=SomeAppCode

在这个场景中,ASP.NET Web从appCode中提取appCode,从主体中提取DTO。然后,服务器方法按预期执行。

  1. 如果在POST方法中包含FromUri字符串appCode,在测试中包含request.AddParameter("appCode",AppCode);则测试失败。错误消息:在控制器上找不到方法

这个失败的原因是appCode被添加到主体中。但是,服务器希望它在uri中。因此,框架无法找到与uri匹配并抛出所述错误的方法。

溶液

如果可以的话,我会改变路线和你的行动:

代码语言:javascript
复制
[Route("UserRoles/{appCode}"]
[AllowAnonymous]
public IHttpActionResult Post(string appCode, UserroleDto userroleDto)
{
    return OK();
}

通过此更改,url将变成:

代码语言:javascript
复制
http://localhost:8089/UserRoles/SomeAppCode

可以把身体放进身体里。

那么,您的测试代码将是:

代码语言:javascript
复制
[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);
}
票数 1
EN

Stack Overflow用户

发布于 2015-11-20 18:49:35

对你实验的行为的解释

  1. 如果我推荐出POST方法中的FromUri字符串appCode和request.AddParameter("appCode",AppCode),那么测试通过。

如果没有FromUri,控制器希望通过请求体接收AppCode,这正是RestSharp.AddParameter()实际上所做的。考试合格,一切顺利!

  1. 如果我在POST方法中包含FromUri字符串appCode,并且从POSTMAN运行该方法,则测试通过。

在这里,您可能使用POSTMAN调用适当的url,其中包含一个查询参数。测试合格,如果您正在查询的url有您期望的签名,那么一切都很好。

  1. 如果在POST方法中包含FromUri字符串appCode,在测试中包含request.AddParameter("appCode",AppCode);则测试失败。错误消息:在控制器上找不到方法

在这里,它失败了,因为控制器期望以查询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进行的测试需要适合您的控制器实际实现的功能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33829292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档