在Python请求和ASP.Net Core API之间,发布值始终为null

时间:2019-02-08 14:56:24

标签: asp.net-core python-requests python-requests-html

我有一些简单的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#代码断点时,传入参数'value'始终为null。我尝试发送JSON而不是简单的字符串,在Python中将标头设置为“文本/纯文本”,“应用程序/ json”或“应用程序/ x-www-form-urlencoded”,但结果是相同的。我曾尝试在ASP.Net Core API中修饰参数[FromBody],但随后出现400错误(“输入无效”)。

我想念什么?

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

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错误。)

2 个答案:

答案 0 :(得分:1)

您好,我也遇到过同样的问题,我想您已经解决了,但我想在此处发布解决方案。

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

因此在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 = {“用户名”:“ selzero”}

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

这有效,MVC控制器[FromBody]喜欢它。

答案 1 :(得分:0)

如果您这样发出请求:

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

这将把'hallo'与方法参数value相关联:

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

如果需要发送更多数据,还可以将请求包装在一个对象中,然后通过模型绑定来获取它。在此处查看更多信息:Model Validation in 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