当参数是一个带有新行的数组时,curl无法将json参数发送到MVC3应用程序中的JsonResult中
本文关键字:参数 json JsonResult 应用程序 MVC3 curl 一个 数组 新行 | 更新日期: 2023-09-27 18:21:46
我有一个有趣的情况,我们有一个外部用户在我们的C#应用程序中使用curl调用json方法。当用户在没有换行的情况下传递参数时,它会很好地发送内容。但是,当有新行时,服务器不会接收到参数。
这是正在调用的命令:
curl -X POST -H "Content-Type: application/json" --data-binary @logUsage.json http://[url]/api/venueserver/0001/logUsage
以下是有效的文件内容:
{
"request": "logUsage",
"venueServerId": "5406e6e51ea59609d07a5809",
"usage": [[ "dateTime", "userId", "source", "level", "event", "message" ],[ "2014-05-02T23:39:20Z", null, "tcpServer", "usage", "connect", null ],[ "2014-05-02T23:39:21Z", "1", "tcpServer", "usage", "connect", null ],[ "2014-05-02T23:39:22Z", "1", "tcpServer", "usage", "login", "userIsFriend" ],[ "2014-05-02T23:39:23Z", "1", "tcpServer", "usage", "setChannel", "2" ],[ "2014-05-02T23:39:25Z", null, "tcpServer", "usage", "disconnect", null ]]
}
这是失败的文件内容:
{
"request": "logUsage",
"venueServerId": "5406e6e51ea59609d07a5809",
"usage": [[ "dateTime", "userId", "source", "level", "event", "message" ],
[ "2014-05-02T23:39:20Z", null, "tcpServer", "usage", "connect", null ],
[ "2014-05-02T23:39:21Z", "1", "tcpServer", "usage", "connect", null ],
[ "2014-05-02T23:39:22Z", "1", "tcpServer", "usage", "login", "userIsFriend" ],
[ "2014-05-02T23:39:23Z", "1", "tcpServer", "usage", "setChannel", "2" ],
[ "2014-05-02T23:39:25Z", null, "tcpServer", "usage", "disconnect", null ]]
}
这是接收内容的C#调用。
public JsonResult LogUsage(string venueServerId, List<List<string>> usage)
{
...
}
我也试过这样做。
public JsonResult LogUsage(string venueServerId, string usage)
{
---
}
即使填充了另一个参数,这两种情况都会为值用法返回null。
我用httpbin.org/post尝试了你的确切cURL,它在有换行符和没有换行符的情况下都很好。根据cURL manfile"数据的发布方式与--Data-ascii类似,只是保留了换行符,并且从不进行转换。"是否尝试使用--data-ascii
而不是--data-binary
?
您可以根据httpbin.org测试您的cURL语句,以检查您的服务器或客户端是否存在问题。请参见下文。
curl -X POST -H "Content-Type: application/json" --data-binary @logUsage.json httpbin.org/post
只是好奇,客户端运行的是什么操作系统?
编辑:(在看到c#签名后)
我不相信你可以将json作为字符串传递到MVC控制器方法中,所以第二个方法不起作用。第一个会起作用,但我过去也遇到过类似的嵌套集合的问题。通常我使用DynamicJson或DefaultModelGraphBinderCollectionExtensions。
这两种方法都能解决很多问题。