0

我有一些简单的 Python

import requests
response = requests.post(url+'users/', data = 'hallo')

和一个简单的 ASP.Net Core API

public void Post(string value)
{
    var newUser = JsonConvert.DeserializeObject<User>(value);
    // [...]
}

当我对 C# 代码进行断点时,传入参数“值”始终为空。我尝试发送 JSON 而不是简单的字符串,在 Python 中将标头设置为“text/plain”、“application/json”或“application/x-www-form-urlencoded”,但结果是一样的。我曾尝试[FromBody]在 ASP.Net Core API 中装饰参数,但随后出现 400 错误(“输入无效”)。

我错过了什么?

(编辑。这是一个 hacky 修复,绝对不是答案,但它可以帮助人们了解问题所在。

public void Post(string value)
{
    Request.EnableRewind();
    var body = "";
    using (var reader = new StreamReader(Request.Body))
    {
        Request.Body.Seek(0, SeekOrigin.Begin);
        body = reader.ReadToEnd();
    }
    value = body;
    var newUser = JsonConvert.DeserializeObject<User>(value);
    // [...]
}

然后正确设置值。但是,如果该值位于帖子正文中,那么使用[FromBody]会导致 400 错误令人沮丧。)

4

2 回答 2

3

嗨dumbledad我有同样的问题,我想你会解决它,但我想在这里发布解决方案。

我不得不将数据发送到参数而不是数据。

所以在 Python 方面:

payload = {"type": "2"}
myheaders={'Content-type':'application/json', 'Accept':'application/json'}
r = requests.post(url=myurl,headers=myheaders, params=payload)

在 c# 方面:

[Route("MyFunction")]
[HttpPost]
public ActionResult GetOpenFootball_(string type){}

这将值“2”映射到名为“type”的字符串参数。

编辑

我设法以这种方式通过 [From Body] 标签获取对象:

我将标题更改为:_headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}

我将参数放入 json 中,例如: jsondata = {"username":"selzero"}

然后我将它插入到请求中的 json 属性中,例如: r = requests.post(url=_url, headers=_headers,json=jsondata)

这行得通,MVC 控制器 [FromBody] 喜欢它。

于 2019-03-18T00:12:34.070 回答
0

如果您提出这样的要求:

response = requests.post(url, data={'value' : 'hallo'})

然后这会将“你好”与方法参数相关联value

[HttpPost]
public void Post(string value)
{
    Console.WriteLine(value);
}

如果您需要发送更多数据,您还可以将您的请求包装在一个对象中并通过模型绑定获取它。在此处查看更多信息:ASP.NET Web API 中的模型验证。看起来这就是您在这里尝试做的事情: var newUser = JsonConvert.DeserializeObject<User>(value);

您可以像这样自动实现这一点:

response = requests.post(url, json={ 'FirstName' : 'john', 'LastName' : 'doe' })

注意使用json=. 在你的控制器中:

public class User {
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

[HttpPost]
public void Post([FromBody] User user)
{
    Console.WriteLine(user.FirstName);
    Console.WriteLine(user.LastName);
}
// Outputs:
// john
// doe
于 2019-02-08T15:53:01.470 回答