深入理解Angularjs中$http.post与$.post


Posted in Javascript onMay 19, 2017

摘要

在angularjs发送post请求的时候,确实很困惑,在传递json数据的时候,总会遇到在服务端无法接受到参数的情况,这里有必要与$.post进行比较学习一下。

一个例子

这里模拟登录的一个场景,post用户名与密码,服务端接受账户并直接返回到客户端不做其它业务处理。

使用angularjs版本

/*
 AngularJS v1.2.15
 (c) 2010-2014 Google, Inc. http://angularjs.org
 License: MIT
*/

服务端

public class AccountController : Controller
  {

    // GET: /<controller>/
    public IActionResult Login()
    {
      return View();
    }
    [HttpPost]    
    public IActionResult Login(string userName,string userPwd)
    {
      var resut = Request.Form;
      return Json(new { _code = 200, _msg = "Login success", name = userName, password = userPwd });
    }
  }

$.post

首先使用$.post的方式,直接提交账户密码

$.post("@Url.Content("~/Account/Login")",{ userName: "2342342", userPwd:"2sssdfs" },function (data) {
      console.log(data);
    });

响应

深入理解Angularjs中$http.post与$.post

这里我们看一下请求体

深入理解Angularjs中$http.post与$.post

那么我们现在看看angularjs的$http.post的情况,到底区别在哪儿?

@{
  Layout = null;
}
<!DOCTYPE html>
<html ng-app="login">
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>IT怪O 用户登录</title>
  <link href="~/lib/bootstrap/dist/css/bootstrap.css" rel="external nofollow" rel="stylesheet" />
  <script src="~/js/angular.min.js"></script>
  <script>
    angular.module("login", []).controller("LoginController", function ($http, $scope) {
      $scope.Login = function () {
        var data = { userName: $scope.userName, userPwd: $scope.userPwd };

        var config = {
          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("&");
          //}
        };
        console.log(data);
        $http.post("@Url.Content("~/Account/Login")", data, config).success(function (data) {
          console.log(data);
        });
      };

    });
  </script>
</head>
<body>
  <div ng-controller="LoginController">
    <input type="text" placeholder="用户名" ng-model="userName" value="" />
    <input type="password" placeholder="密码" ng-model="userPwd" value="" />
    <button ng-click="Login()">登录</button>
  </div>
</body>
</html>

登录

深入理解Angularjs中$http.post与$.post

出现了,处于习惯的原因,平时就会这样来写$http.post的。但结果并不是想要的。那么咱们与$.post对比一下请求体。

深入理解Angularjs中$http.post与$.post

看到没?差别就在这里。

发现问题了,那么我们就要转化为$.post提交参数的方式。幸好,angularjs中$http.post提供了一个转化参数的transformRequest方法,可以在config中加上该参数:

var config = {
          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("&");
          }
        };

 它的作用就是将提交的参数转化为$.post提交参数的方式。这样看到的请求体中参数就与$.post相同了。

可以在全局进行设置

<script>
    angular.module("login", []).controller("LoginController", function ($http, $scope) {
      $scope.Login = function () {
        var data = { userName: $scope.userName, userPwd: $scope.userPwd };
        console.log(data);
        $http.post("@Url.Content("~/Account/Login")", data).success(function (data) {
          console.log(data);
        });
      };

    }).config(function ($httpProvider) {     
      $httpProvider.defaults.transformRequest = function (obj) {
        var str = [];
        for (var p in obj) {
          str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
        }
        return str.join("&");
      };
      $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8';
    });
  </script>

总结

angularjs在进行post请求的时候要进行参数配置。关于angularjs的post请求,建议在初始化模块的时候对post请求设置请求头与请求参数转换的设置,这样可以在其他地方方便使用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
学习从实践开始之jQuery插件开发 菜单插件开发
May 03 Javascript
让jQuery与其他JavaScript库并存避免冲突的方法
Dec 23 Javascript
js弹出div并显示遮罩层
Feb 12 Javascript
node.js中的path.resolve方法使用说明
Dec 08 Javascript
javascript实现移动端上的触屏拖拽功能
Mar 04 Javascript
angularJS 如何读写缓冲的方法(推荐)
Aug 06 Javascript
XMLHttpRequest Level 2 使用指南
Aug 26 Javascript
深入了解JavaScript的逻辑运算符(与、或)
Dec 20 Javascript
vue实现个人信息查看和密码修改功能
May 06 Javascript
React 组件间的通信示例
Jun 14 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
Aug 24 Javascript
js定义类的方法示例【ES5与ES6】
Jul 30 Javascript
jQuery插件select2利用ajax高效查询大数据列表(可搜索、可分页)
May 19 #jQuery
EasyUI Datebox 日期验证之开始日期小于结束时间
May 19 #Javascript
javascript 开发之百度地图使用到的js函数整理
May 19 #Javascript
微信小程序表单验证错误提示效果
May 19 #Javascript
微信小程序实现滑动删除效果
May 19 #Javascript
微信小程序图片横向左右滑动案例
May 19 #Javascript
layui导航栏实现代码
May 19 #Javascript
You might like
PHP数组内存耗用太多问题的解决方法
2010/04/05 PHP
ajax+php打造进度条代码[readyState各状态说明]
2010/04/12 PHP
PHP 多维数组的排序问题 根据二维数组中某个项排序
2011/11/09 PHP
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
2012/03/27 PHP
基于php iconv函数的使用详解
2013/06/09 PHP
php实现的一个很好用HTML解析器类可用于采集数据
2013/09/23 PHP
KindEditor在php环境下上传图片功能集成的方法示例
2020/07/20 PHP
encode脚本和normal脚本混用的问题与解决方法
2007/03/08 Javascript
jQuery LigerUI 插件介绍及使用之ligerDrag和ligerResizable示例代码打包
2011/04/06 Javascript
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
可插入图片的TEXT文本框
2013/12/27 Javascript
jQuery获取节点和子节点文本的方法
2014/07/22 Javascript
AngularJS实现网站换肤实例
2021/02/19 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
详解vue 中使用 AJAX获取数据的方法
2017/01/18 Javascript
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
vue2 全局变量的设置方法
2018/03/09 Javascript
用react-redux实现react组件之间数据共享的方法
2018/06/08 Javascript
node中的cookie的具体使用
2018/09/13 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
微信小程序wx.navigateTo方法里的events参数使用详情及场景
2020/01/07 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
2020/02/19 Javascript
[49:42]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第一局
2016/03/04 DOTA
在Python中使用M2Crypto模块实现AES加密的教程
2015/04/08 Python
好用的Python编辑器WingIDE的使用经验总结
2016/08/31 Python
在python带权重的列表中随机取值的方法
2019/01/23 Python
Python使用tkinter模块实现推箱子游戏
2019/10/08 Python
如何在Python对Excel进行读取
2020/06/04 Python
利用css3如何设置没有上下边的列表间隔线
2017/07/03 HTML / CSS
英国领先的在线礼品店:Getting Personal
2019/09/24 全球购物
DBA的职责都有哪些
2012/05/16 面试题
C#如何进行LDAP用户校验
2012/11/21 面试题
土木工程专业大学毕业生求职信
2013/10/13 职场文书
最美护士演讲稿
2014/08/27 职场文书
SONY AN-LP1 短波有源天线放大器图
2022/04/05 无线电
JavaScript圣杯布局与双飞翼布局实现案例详解
2022/08/05 Javascript