AngularJS restmod:POST 向 Django REST 请求带有“?a=b”的字符串

AngularJS restmod: POST request to Django REST of string with "?a=b"

我正在使用 angular-restmodDjango REST Framework 后端发送 POST 请求。但是每当包含 ? 的字符串将导致损坏的 POST 数据(收到时):例如,假设我正在发送 POST 数据

{"properties": "values", "status": "?a=3", "other properties": "other values"}

后端会收到request.data

MergeDict(<QueryDict: {u'{"properties": "values", "status": "?a': [u'3", "other properties": "other values"']}>, <MultiValueDict: {}>)

事情在 = 开始分崩离析。

PUT 方法在这种情况下效果很好。我想知道如何解决这个问题?

==========编辑========== 最后我找到了 $http 的旧设置:

# $httpProvider.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded"

它会覆盖 restmod 的默认 JSON 内容类型。我去掉了,问题解决了

虽然我不知道 anuglar-restmod 的确切工作原理,但看起来您正在尝试发送类似 JSON 的数据,但它实际上是作为表单编码数据发送的。数据经过表单编码后,会组合成 key1=val1[&key2=val2...] 并在请求正文中作为一个长字符串发送。

因此,当您期望 JSON 数据作为

发送时
{"properties": "values", "status": "?a=3", "other properties": "other values"}

它实际上是作为表单编码数据发送的,采用

的形式
{"properties": "values", "status": "?a=3", "other properties": "other values"

这应该使您的问题实际变得有些明显:它不是实际上是形式编码的。这被分解为 {"properties": "values", "status": "?a 是键,3", "other properties": "other values" 是值。

这是 may be the fault of the tools you are using, but there is one easy way to fix it: make sure you are using JSON 的一部分。