$http 调用 Web API 2 未传递参数
$http Call to Web API 2 Not Passing Parameter
这是我的 C# WebAPI2 控制器,它被命中:
[HttpGet, Route("bycaseidlist/{idArray}")]
public async Task<IHttpActionResult> GetByCaseIdList([FromUri] List<int> idArray)
这是电话:
var idArray = [4,4,2,4];
var url = baseUrl + 'api/cases/bycaseidlist/' + idArray ;
$http.get(url)
问题是 API 没有得到数组,它得到的是……这个:
换句话说,一个数组有一个值:0。为什么会这样?我如何解决它?好像是in-line和this answer,但是不行。我应该在 body 中传递它吗?我觉得我错过了一些明显的东西。
我认为我的错误在于使用 Get。我可能记错了(有人确认你是否知道),但 Get 可能无法将对象作为参数。无论如何,我将方法更改为 POST,然后更改要在请求正文中发送的参数,而不是 url。现在可以了。这是工作代码:
[HttpPost, Route("bycaseidlist")]
public async Task<IHttpActionResult> PostByCaseIdList([FromBody] int[] sqlCaseIdArray)
和调用本身:
function runDbCall(url, sqlCaseIdArray){
return $http({
method: 'POST',
url: url,
data: sqlCaseIdArray
});
}
runDbCall(url, sqlCaseIdArray)
当我弄清楚问题是否是 Get 无法获取对象时,我会回来讨论这个问题,但我认为它可以在 url 中,只是不在 body 中...需要澄清。如果有人仅针对该部分发布答案,我会接受,因为这可能是问题的根源。
Get ActionMethods 可以将对象作为参数。但是,默认行为是在参数不是 .net 原语时查看主体。为了强制操作方法使用模型绑定器从请求中读取对象数据,可以使用 [FromUri] 或 [ModelBinder] 属性修饰参数。 (请注意,还有其他方法可以执行此操作,包括执行参数绑定规则,但这对于您要在此处完成的操作可能有点矫枉过正)。这是解决您提出的原始问题的实现。
<script type="text/javascript">
var ajaxCall = function (myArry) {
var ajaxProperties = {};
ajaxProperties.url = "/api/Mul/Mutiply";
ajaxProperties.type = "Get";
ajaxProperties.data = {};
ajaxProperties.data.numbers = myArry;
ajaxProperties.contentType = "application/json";
console.log(ajaxProperties);
ajaxProperties.success = function (data) {
console.log(data);
}
ajaxProperties.error = function (jqXHR) {
console.log(jqXHR);
};
$.ajax(ajaxProperties);
};
var getData = function (e) {
var myArry = new Array();
myArry.push($('input[name=num1').val());
myArry.push($('input[name=num2').val());
ajaxCall(myArry);
return false;
};
</script>
控制器
[HttpGet]
public IHttpActionResult Multiply([FromUri] int[] numbers)
{
int result = 0;
if(numbers.Length > 0)
{
result = 1;
foreach (int i in numbers)
{
result = result * i;
}
}
return Ok(result);
}
}
这是我的 C# WebAPI2 控制器,它被命中:
[HttpGet, Route("bycaseidlist/{idArray}")]
public async Task<IHttpActionResult> GetByCaseIdList([FromUri] List<int> idArray)
这是电话:
var idArray = [4,4,2,4];
var url = baseUrl + 'api/cases/bycaseidlist/' + idArray ;
$http.get(url)
问题是 API 没有得到数组,它得到的是……这个:
换句话说,一个数组有一个值:0。为什么会这样?我如何解决它?好像是in-line和this answer,但是不行。我应该在 body 中传递它吗?我觉得我错过了一些明显的东西。
我认为我的错误在于使用 Get。我可能记错了(有人确认你是否知道),但 Get 可能无法将对象作为参数。无论如何,我将方法更改为 POST,然后更改要在请求正文中发送的参数,而不是 url。现在可以了。这是工作代码:
[HttpPost, Route("bycaseidlist")]
public async Task<IHttpActionResult> PostByCaseIdList([FromBody] int[] sqlCaseIdArray)
和调用本身:
function runDbCall(url, sqlCaseIdArray){
return $http({
method: 'POST',
url: url,
data: sqlCaseIdArray
});
}
runDbCall(url, sqlCaseIdArray)
当我弄清楚问题是否是 Get 无法获取对象时,我会回来讨论这个问题,但我认为它可以在 url 中,只是不在 body 中...需要澄清。如果有人仅针对该部分发布答案,我会接受,因为这可能是问题的根源。
Get ActionMethods 可以将对象作为参数。但是,默认行为是在参数不是 .net 原语时查看主体。为了强制操作方法使用模型绑定器从请求中读取对象数据,可以使用 [FromUri] 或 [ModelBinder] 属性修饰参数。 (请注意,还有其他方法可以执行此操作,包括执行参数绑定规则,但这对于您要在此处完成的操作可能有点矫枉过正)。这是解决您提出的原始问题的实现。
<script type="text/javascript">
var ajaxCall = function (myArry) {
var ajaxProperties = {};
ajaxProperties.url = "/api/Mul/Mutiply";
ajaxProperties.type = "Get";
ajaxProperties.data = {};
ajaxProperties.data.numbers = myArry;
ajaxProperties.contentType = "application/json";
console.log(ajaxProperties);
ajaxProperties.success = function (data) {
console.log(data);
}
ajaxProperties.error = function (jqXHR) {
console.log(jqXHR);
};
$.ajax(ajaxProperties);
};
var getData = function (e) {
var myArry = new Array();
myArry.push($('input[name=num1').val());
myArry.push($('input[name=num2').val());
ajaxCall(myArry);
return false;
};
</script>
控制器
[HttpGet]
public IHttpActionResult Multiply([FromUri] int[] numbers)
{
int result = 0;
if(numbers.Length > 0)
{
result = 1;
foreach (int i in numbers)
{
result = result * i;
}
}
return Ok(result);
}
}