将字符串数组发布到 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,如何添加正文字符串数组?

关于将大字符串发布到 Web 服务的建议

使用 Lumen + Guzzle 的 API 调用提供错误数组到字符串的转换

如何将 json 对象数组发布到 Web api

使用 HttpClient 将字节数组发布到 Web API 服务器

axios 前端Post 传字符串数组给 Web Api 接收