【问题标题】:How to call a Post api with multiple parameters如何调用具有多个参数的 Post api
【发布时间】:2013-02-28 11:37:13
【问题描述】:

如何使用 HttpClient 调用具有多个参数的 Post 方法?

我正在使用带有单个参数的以下代码:

var paymentServicePostClient = new HttpClient();
paymentServicePostClient.BaseAddress = 
                  new Uri(ConfigurationManager.AppSettings["PaymentServiceUri"]);

PaymentReceipt payData = SetPostParameter(card);
var paymentServiceResponse = 
   paymentServicePostClient.PostAsJsonAsync("api/billpayment/", payData).Result;

我需要添加另一个参数 userid。如何将参数与“postData”一起发送?

WebApi POST 方法原型:

public int Post(PaymentReceipt paymentReceipt,string userid)

【问题讨论】:

  • 如何从您的 Web API 中操作?
  • '来自 webapi 的操作'是什么意思?
  • 您希望在 Web Api 中调用 POST 请求的方法
  • @Cuong Le,我更新了帖子
  • 有了这个Web Api,我看不到userId?

标签: c# asp.net-web-api httpclient


【解决方案1】:

只需在包含这两个属性的 Web Api 控制器上使用视图模型。所以而不是:

public HttpresponseMessage Post(PaymentReceipt model, int userid)
{
    ...
}

使用:

public HttpresponseMessage Post(PaymentReceiptViewModel model)
{
    ...
}

PaymentReceiptViewModel 显然包含userid 属性。然后就可以正常调用该方法了:

var model = new PaymentReceiptViewModel()
model.PayData = ...
model.UserId = ...
var paymentServiceResponse = paymentServicePostClient
    .PostAsJsonAsync("api/billpayment/", model)
    .Result;

【讨论】:

  • 就这样吗?帖子不能有多个参数?
  • 这应该是imo接受的答案,目前接受的答案只适用于简单类型
  • @reggaeguitar。我不同意。一方面,这并不能直接回答问题。而且,从为遗留系统构建集成测试的测试自动化工程师的角度来看,有时控制器的格式是无法控制的。所以我认为提出的问题本身是完全合法的。在我自己的情况下,简单类型就是被传递给其中一些函数的所有内容,因此当前接受的答案正是我所需要的。
【解决方案2】:

UserId 应该在查询字符串中:

var paymentServiceResponse = paymentServicePostClient
                            .PostAsJsonAsync("api/billpayment?userId=" + userId.ToString(), payData)
                            .Result;

【讨论】:

  • 这正是我克服困难所需要的。但是,我发现有趣的是,至少如果第一个参数不是复杂类型,Web API 不会将其传递给调用函数,除非它也包含在查询字符串中。现在我必须在两个地方都保留它,因为如果我将它从函数参数中取出,C# 将无法编译。 PostAsJsonAsync 无论如何都必须有第二个参数。但是在单步执行代码时,我看不到它实际上使用了参数,除非它也在查询字符串中。
【解决方案3】:

在我的情况下,我现有的 ViewModel 与我想要发布到我的 WebAPI 的数据不能很好地对齐。因此,我没有创建一组全新的模型类,而是发布了一个匿名类型,并让我的 Controller 接受一个动态的。

var paymentServiceResponse = paymentServicePostClient.PostAsJsonAsync("api/billpayment/", new { payData, userid }).Result;



public int Post([FromBody]dynamic model)
{
    PaymentReceipt paymentReceipt = (PaymentReceipt)model.paymentReceipt;
    string userid = (string)model.userid;

    ...

}

(我很想听听关于这种方法的一些反馈。它的代码肯定少了很多。)

【讨论】:

  • 很棒的解决方案。使用[FromBody][FromUri] 非常简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-09
  • 2021-09-05
  • 1970-01-01
  • 2016-03-14
  • 2011-10-14
  • 1970-01-01
相关资源
最近更新 更多