我有一些简单的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错误。)
答案 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