http post返回奇怪的JSON
http post返回奇怪的JSON
我是AngularJS的新手,为了开始,我想使用AngularJS开发一个新的应用程序。
我试图使用我的Angular应用程序中的$http
向服务器端发起AJAX请求。
我尝试了以下方式来发送参数:
$http({ method: "post", url: URL, headers: {'Content-Type': 'application/x-www-form-urlencoded'}, data: $.param({username: $scope.userName, password: $scope.password}) }).success(function(result){ console.log(result); });
这个方法可以工作,但是它还同时使用了jQuery中的$.param
。为了去除对jQuery的依赖,我尝试了:
data: {username: $scope.userName, password: $scope.password}
但是这似乎失败了。然后我尝试了params
:
params: {username: $scope.userName, password: $scope.password}
但是这也似乎失败了。然后我尝试了JSON.stringify
:
data: JSON.stringify({username: $scope.userName, password: $scope.password})
我找到了这些可能是解决方法,但是都没有成功。我是不是做错了什么?我确信AngularJS会提供这个功能,但是怎么用呢?
在这篇文章中,我们将讨论一个关于HTTP POST请求返回奇怪JSON的问题,探讨其出现的原因以及解决方法。
问题的出现是因为在发送HTTP POST请求时,可能会出现错误的Content-Type头部。在给出的代码示例中,我们可以看到请求被发送到了登录URL,并且包含了用户名、密码以及授权类型等参数。然而,没有明确指定请求的Content-Type头部。
对于一些服务器来说,如果没有正确指定Content-Type头部,可能会导致请求失败或返回错误的JSON格式。因此,为了解决这个问题,我们需要在发送请求时明确指定Content-Type头部为'application/x-www-form-urlencoded'。
以下是修改后的代码示例:
$http.post(loginUrl, `username=${ encodeURIComponent(username) }` + `&password=${ encodeURIComponent(password) }` + '&grant_type=password', { headers: {'Content-Type': 'application/x-www-form-urlencoded'} } ).success(function (data) {
通过在请求中添加{ headers: {'Content-Type': 'application/x-www-form-urlencoded'} }作为配置参数,我们可以确保请求中包含了正确的Content-Type头部。这样做可以避免出现奇怪的JSON返回值,并且能够成功进行身份验证。
总结起来,解决这个问题的方法是明确指定HTTP POST请求的Content-Type头部为'application/x-www-form-urlencoded'。这可以通过在发送请求时添加{ headers: {'Content-Type': 'application/x-www-form-urlencoded'} }作为配置参数来实现。希望这个解决方案能够帮助到你!
在使用AngularJS进行POST请求时,有时会遇到返回奇怪JSON的问题。这个问题的出现原因是因为在发送POST请求时,没有正确地对数据进行URL编码,导致返回的JSON格式不正确。要解决这个问题,可以使用AngularJS提供的两个服务来处理URL编码的过程,分别是$httpParamSerializerJQLike和$httpParamSerializer。前者是受到jQuery的序列化方法param()的启发而开发的,后者则是Angular自身用于处理GET请求的序列化方法。
下面是使用$httpParamSerializerJQLike进行URL编码的示例代码:
$http({ url: 'some/api/endpoint', method: 'POST', data: $httpParamSerializerJQLike($scope.appForm.data), headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }).then(function(response) { // 处理返回的数据 });
注意,需要先将对应的服务注入到控制器中。
如果使用$http.post()方法发送POST请求,也可以使用相同的方法对数据进行URL编码,示例代码如下:
$http.post( 'some/api/endpoint', data: $httpParamSerializerJQLike($scope.appForm.data), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } ).then(function(response) { // 处理返回的数据 });
需要注意的是,使用$http.post()方法时,参数的传递方式略有不同。
此外,需要注意的是,使用$httpParamSerializerJQLike和$httpParamSerializer进行URL编码时,对于复杂的数据结构,两者的编码格式略有不同。比如,对于数组的编码,$httpParamSerializerJQLike会将数组名作为参数名,并用[]表示多个值,而$httpParamSerializer则直接使用参数名表示多个值。对于对象的编码,$httpParamSerializerJQLike会使用[]表示对象的属性名,而$httpParamSerializer则直接使用JSON格式表示对象。
希望这篇文章能够帮助你理解并解决使用AngularJS发送POST请求时返回奇怪JSON的问题。
问题:http post返回奇怪的JSON是如何出现的以及如何解决?
在AngularJS中,$http服务默认会将传出的请求数据序列化为JSON字符串,并且以"application/json"的内容类型进行POST请求。但是,当我们想要将数据作为表单提交时,就需要改变序列化算法,并以"application/x-www-form-urlencoded"的内容类型进行POST请求。
解决方法如下:
$http({ method: 'POST', url: url, headers: {'Content-Type': 'application/x-www-form-urlencoded'}, transformRequest: function(obj) { var str = []; for(var p in obj) str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p])); return str.join("&"); }, data: {username: $scope.userName, password: $scope.password} }).then(function () {});
如果需要提交multipart/form-data格式的数据,可以使用angular.element.param(obj)方法进行转换。
需要注意的是,这个问题的解决方法是针对AngularJS 1.4及以上版本的。在1.4版本中,新增了$httpParamSerializer服务,可以更方便地进行URL编码变量。可以通过注入$httpParamSerializerJQLike或$httpParamSerializer来使用这个服务。
然而,有些人在使用AngularJS 1.6.6版本时无法注入$httpParamSerializerJQLike或$httpParamSerializer服务,可能会遇到undefined或$http function的问题。在这种情况下,可以使用上述提到的方法进行解决。
通过将数据转换为URL参数格式,而不是JSON字符串,可以解决http post返回奇怪JSON的问题。同时,也介绍了如何处理multipart/form-data格式的数据以及在不同版本的AngularJS中的差异处理方法。