将字符串数组发布到 Web API 方法
Posted
技术标签:
【中文标题】将字符串数组发布到 Web API 方法【英文标题】:Post array of strings to web API method 【发布时间】:2012-12-21 22:42:17 【问题描述】:这是我的客户端 ajax 调用:
var list = ["a", "b", "c", "d"];
var jsonText = data: list ;
$.ajax(
type: "POST",
url: "/api/scheduledItemPriceStatus/updateStatusToDelete",
data: jsonText,
dataType: "json",
traditional: true,
success: function() alert("it worked!"); ,
failure: function() alert("not working...");
);
这是 chrome 网络标头:
Request URL:http://localhost:2538/api/scheduledItemPriceStatus/updateStatusToDelete
Request Method:POST
Request Headersview source
Accept:application/json, text/javascript, */*; q=0.01
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:27
Content-Type:application/x-www-form-urlencoded; charset=UTF-8
Host:localhost:2538
Origin:http://localhost:2538
Referer:http://localhost:2538/Pricing/ScheduledItemPrices
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (Khtml, like Gecko) Chrome/23.0.1271.97 Safari/537.11
X-Requested-With:XMLHttpRequest
表单数据视图 URL 编码
data:a
data:b
data:c
data:d
这是我的 webapi 控制器方法:
public HttpResponseMessage UpdateStatusToDelete(string[] data)
结果:
当我调试时,UpdateStatusToDelete 中的 data 参数返回 string[0]
而不是 data:a
数据:b
数据:c
数据:d
我做错了什么?非常感谢任何帮助。
【问题讨论】:
嗯,我认为您应该直接将list
变量作为数据字段传递给您的ajax 调用。现在,您似乎正在传递一个对象,该对象具有一个字符串数组作为名为“data”的成员字段。
第一行是否编译..?变量列表 = [“a”、“b”、“c”、“d”]?应该是这样的string[] list = "a", "b", "c", "d";
@Eunyoung Ro 看看我的评论你有错别字吗?你也确定代码编译..?
【参考方案1】:
对于传递简单类型,要发布的数据必须采用名称值对的形式,名称部分为空字符串。所以你需要像这样进行 Ajax 调用:
$.ajax(
type: "POST",
url: "/api/values",
data: "": list ,
dataType: "json",
success: function() alert("it worked!"); ,
failure: function() alert("not working...");
);
此外,在您的 Web API 操作中,使用 [FromBody] 属性对其进行注释。比如:
public void Post([FromBody]string[] values)
这应该可以解决问题。
【讨论】:
我仍然使用这种方法得到一个空值。不同的是我的 API 也有非正文参数。像 public void Post(string id, [FromBody]string[] values)【参考方案2】:您应该传递list
本身,而不是任何其他包裹它的对象。
例如通过以下内容:
var list = ["a", "b", "c", "d"];
在
$.ajax(
type: "POST",
url: "/api/scheduledItemPriceStatus/updateStatusToDelete",
// Pass the list itself
data: list,
dataType: "json",
traditional: true,
success: function() alert("it worked!"); ,
failure: function() alert("not working...");
);
您在服务器上的方法签名是正确的。
【讨论】:
【参考方案3】:使用var jsonText = data: JSON.stringify(list)
【讨论】:
克里斯现在我可以告诉你,列表部分将编译..检查代码并告诉我.... [] 应该是 【参考方案4】:在后端,您可以使用FormDataCollection.GetValues(string key)
为该参数返回一个字符串数组。
public HttpResponseMessage UpdateStatusToDelete(FormDataCollection formData)
string[] data = formData.GetValues("data");
...
【讨论】:
【参考方案5】:按照 cris 在您的 jquery ajax 调用中的建议,使用上述方法发送数组。 JSON 数据通常在键值对中。
var tmp = [];
tmp.push(
//this is the key name 'a' "a": "your value", //it could be anything here in
//string format.
"b": "b",
"c": "c",
"d": "d"
);
data: JSON.stringify(tmp);
你也可以通过使用二维数组来完成上述操作
另外在 webapi 项目中执行此操作。
在您的 web api 项目的模型文件夹下创建一个类文件。可能是 class1.cs。
创建 4 个属性
public string a get; set;
public string b get; set;
public string c get; set;
public string d get; set;
现在在您的控制器中执行此操作
using projectname.models
[HttpPost]
public return-type actionname(List<Class1> obj)
//Further logic goes here
我相信这会奏效。
【讨论】:
【参考方案6】:设置 dataType 对你没有帮助。
这就是我的做法:
var SizeSequence = ;
SizeSequence.Id = parseInt(document.querySelector("dd#Sequence_Id").textContent);
SizeSequence.IncludedSizes = [];
var sizes = document.querySelectorAll("table#IncludedElements td#Size_Name");
// skipping the first row (template)
for (var i = 1, l = sizes.length ; i != sizes.length ; SizeSequence.IncludedSizes.push(sizes[i++].textContent));
$.ajax("/api/SizeSequence/" + SizeSequence.Id,
method: "POST",
contentType: "application/json; charset=UTF-8",
data: JSON.stringify(SizeSequence.IncludedSizes),
...
服务器部分
// /api/SizeSequence/5
public async Task<IHttpActionResult> PostSaveSizeSequence(int? Id, List<String> IncludedSizes)
if (Id == null || IncludedSizes == null || IncludedSizes.Exists( s => String.IsNullOrWhiteSpace(s)))
return BadRequest();
try
await this.Repo.SaveSizeSequenceAsync(Id.Value, IncludedSizes );
return Ok();
catch ( Exception exc)
return Conflict();
参考文献
jQuery.ajax()
【讨论】:
【参考方案7】:您也可以使用JSON.stringify
执行此操作,这在语义上比将内容放入具有空字符串键的对象中更直观。 (我正在使用 Web API 2,不确定这是否重要。)
客户端代码
$.ajax(
type: 'POST', //also works for PUT or DELETE
url: '/api/UserRole',
contentType: "application/json",
data: JSON.stringify(["name1", "name2"])
)
服务器代码
[HttpPost]
[Route("api/UserRole")]
public IHttpActionResult AddUsers(string[] usernames)
【讨论】:
以上是关于将字符串数组发布到 Web API 方法的主要内容,如果未能解决你的问题,请参考以下文章
异步任务HttpPost请求DoInbackground调用web api Android Studio Java,如何添加正文字符串数组?
使用 Lumen + Guzzle 的 API 调用提供错误数组到字符串的转换