我有一个.net mvc 4 webapi项目,我试图将一个对象数组传递给我的控制器上的方法.
我在这里找到了一些关于需要设置我的对象属性的例子:param1 = whatever¶m2 = bling¶m3 = blah.
但我不知道如何使用它来传递集合.
这是我的方法签名.注意我用[FromUri]属性修饰了参数.
public List<PhoneResult> GetPhoneNumbersByNumbers([FromUri] PhoneRequest[] id)
{
List<PhoneResult> prs = new List<PhoneResult>();
foreach (PhoneRequest pr in id)
{
prs.Add(PhoneNumberBL.GetSinglePhoneResult(pr.PhoneNumber, pr.RfiDate, pr.FinDate, pr.State));
}
return prs;
}
Run Code Online (Sandbox Code Playgroud)
这是我简单的PhoneRequest对象:
public class PhoneRequest
{
public string PhoneNumber { get; set; }
public string RfiDate { get; set; }
public string FinDate { get; set; }
public string State { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我用来传递的样本:
http://localhost:3610/api/phonenumber/getphonenumbersbynumbers/
[{"PhoneNumber":"8016667777","RfiDate":"","FinDate":"2012-02-11","State":"UT"},
{"PhoneNumber":"8018889999","RfiDate":"2012-12-01","FinDate":"","State":"UT"}]
Run Code Online (Sandbox Code Playgroud)
用这个"坏请求"回来
我也尝试过这个
http://localhost:3610/api/phonenumber/getphonenumbersbynumbers?
id=[{"PhoneNumber":"8016667777","RfiDate":"","FinDate":"2012-02-11","State":"UT"}, …Run Code Online (Sandbox Code Playgroud) 我有一个现有的WebApi动作,我想从HttpPost切换到HttpGet.它目前需要一个复杂的对象作为参数.
该模型:
public class BarRequest
{
[JsonProperty("catid")]
public int CategoryId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
控制器:
public class FooController : ApiController
{
//[HttpPost]
[HttpGet]
[ActionName("bar")]
public void Bar([FromUri] BarRequest request)
{
if (request != null)
{
// CategoryId should be 123, not 0
Debug.WriteLine("Category ID :: {0}", request.CategoryId);
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在当我发送以下请求时,一切都按预期工作.
GET /foo/bar?CategoryId=123
Run Code Online (Sandbox Code Playgroud)
旧的POST请求也按预期工作.
POST /foo/bar {"catid":123}
Run Code Online (Sandbox Code Playgroud)
但现在我需要以下请求才能工作:
GET /foo/bar?catid=123
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?
所以我知道如何使用[FromUri]WebApi[FromBody]控制器的“Post”方法。不用说[FromUri],“Get”方法是不必要的,但很明确,并且效果很好。我的问题是我希望 WebApi 在“Get”方法上解析我的 HttpBody 以填充我的对象参数。像这样...
public IHttpActionResult Get([FromBody]Customer c) {
if (c is null) {
// problem :-(
}
}
Run Code Online (Sandbox Code Playgroud)
首先,让我解释一下我为什么要这样做。这是因为我的“获取”URL 很复杂。我需要在其中包含 JSON 对象。因此,虽然我知道使用 HTTP Body 作为“Get”上的有效负载并不是完美的 REST,但我还是愿意这样做。
其次,对于那些认为我应该将其包含在 URL 中的人……好吧,好吧。但是,请告诉我如何测试,因为我尝试在 URL 上输入 JSON 对象,浏览器引用了它的内容,但即使使用[FromUri]我的“获取”WebApi 控制器方法,我也无法解析它。我也尝试通过 Swagger 卷曲,但同样的问题。
我的 JSON 对象很简单{ "a" : "A", "b" : "B" }。
预先感谢您的任何帮助。
GET :http://www.Example.com/Api/1/0/Book/Company/0
[Route("{UserId}/{Category}/books/{BookType}/{Page}")]
[HttpGet]
[RequestAuthorization]
public Response Get(int UserId,string Category, string BookType,int Page )
{
var books= this.contentService.GetUserItems(UserId,Category, BookType, Page)
return new Response() { Status = ApiStatusCode.Ok, Books = books};
}
Run Code Online (Sandbox Code Playgroud)
上面的代码对我很有用.
我的问题是可以在GET请求中绑定请求模型吗?
例如,我有一个这样的请求模型
public class BookbRequestModel
{
public int UserId { get; set; }
public int Category { get; set; }
public int Page { get; set; }
public string BookType { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想要这样的获取请求
GET :http://www.Example.com/Api/1/0/Book/Company/0
to bind the data to my request model
[Route("{UserId}/{Category}/books/{BookType}/{Page}")]
[HttpGet] …Run Code Online (Sandbox Code Playgroud)