asp.net-mvc - MVC 发布原始正文
问题描述
我们在我们的网站上使用 amp-html 和 amp-consent 来管理 cookie 同意。这有一个设置,您可以指定一个端点onUpdateHref
我可以看到这个请求是在网络选项卡中发出的,并且有一个请求有效负载。
{"consentInstanceId":"my-consent","ampUserId":"amp-xxxx","consentState":true,"consentStateValue":"accepted"}
我正在努力制定 MVC 操作方法签名以接收此请求。我尝试将其添加为方法中的单个属性:
[HttpPost]
public ActionResult updateconsent(string consentInstanceId, string ampUserId, bool consentState, string consentStateValue)
{
}
或者创建一个类定义:
public class updateConsentObj
{
string consentInstanceId { get; set; }
string ampUserId { get; set; }
public bool consentState { get; set; }
public string consentStateValue { get; set; }
}
并将其作为属性传递:
public ActionResult updateconsent(updateConsentObj obj)
{
}
我还尝试添加FromBody
到签名:
public ActionResult updateconsent([System.Web.Http.FromBody]updateConsentObj obj)
{
}
我尝试的所有结果都是空值。
我可以读取有效负载数据的唯一方法如下:
Stream req = Request.InputStream;
req.Seek(0, System.IO.SeekOrigin.Begin);
string json = new StreamReader(req).ReadToEnd();
解决方案
有几件事情要做或检查:
(1 )在你的.public
class updateConsentObj
(2)确保您的 POST 请求包含一个标头Content-Type: application/json
,它告诉 MVC 使用 JSON 解析器。
(3)您发布的JSON中有一个缺失"
,应该是{"consentInstanceId":"my-consent","ampUserId":"amp-xxxx","consentState":true,"consentStateValue":"accepted"}
应用上述所有方法后,我能够成功调用这两种类型的 Action Method。有关我使用的代码和结果,请参见下文。
使用一个类:
[HttpPost]
public ActionResult updateconsent([System.Web.Http.FromBody]updateConsentObj obj)
{
return Content(
"OK: " +
"obj.consentInstanceId = [" + (obj.consentInstanceId ?? "(null)") + "], " +
"obj.ampUserId = [" + (obj.ampUserId ?? "(null)") + "], " +
"obj.consentState = [" + obj.consentState + "], " +
"obj.consentStateValue = [" + (obj.consentStateValue ?? "(null)") + "]");
}
这产生
好的:obj.consentInstanceId = [我的同意],obj.ampUserId = [amp-xxxx],obj.consentState = [True],obj.consentStateValue = [接受]
使用单独的参数:
[HttpPost]
public ActionResult updateconsent(string consentInstanceId, string ampUserId, bool consentState, string consentStateValue)
{
return Content(
"OK: " +
"consentInstanceId = [" + (consentInstanceId ?? "(null)") + "], " +
"ampUserId = [" + (ampUserId ?? "(null)") + "], " +
"consentState = [" + consentState + "], " +
"consentStateValue = [" + (consentStateValue ?? "(null)") + "]");
}
这产生
OK:consentInstanceId = [my-consent],ampUserId = [amp-xxxx],consentState = [True],consentStateValue = [接受]
推荐阅读
- javascript - 如何从状态设置输入值并允许用户更改它?
- python - 有没有一种简单的方法可以在 DIN A4 jpeg 上将 Matplotlib 图(Saros Dial)打印到精确尺寸?
- python - 如何在 Python 中将极坐标图导出为分段贝塞尔曲线/SVG 路径
- solr - SOLR:需要对具有字段值的文档和没有字段本身的文档执行过滤查询
- python-3.x - Keras LSTM 层值错误:维度必须相等,但分别为 17 和 2
- linux - Caddy V2 IP 白名单
- javascript - 使用 AJAX + Javascript 将图像上传到 PHP 网站上的 IMGBB (Bootstrap)
- python - 压缩文件夹中的特定文件 - 找不到 zip 文件
- django - django+gunicorn+nginx 在提供静态文件时给出 404
- javascript - 无法在量角器 e2e 测试中找到 MatSnackBar 元素