[Angularjs]$http.post与$.post

摘要

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

一个例子

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

使用angularjs版本

服务端

</span><span style="color: #008000;"&gt;//</span><span style="color: #008000;"&gt; GET: /<controller>/</span> <span style="color: #0000ff;"&gt;public</span><span style="color: #000000;"&gt; IActionResult Login() { </span><span style="color: #0000ff;"&gt;return</span><span style="color: #000000;"&gt; View(); } [HttpPost] </span><span style="color: #0000ff;"&gt;public</span> IActionResult Login(<span style="color: #0000ff;"&gt;string</span> userName,<span style="color: #0000ff;"&gt;string</span><span style="color: #000000;"&gt; userPwd) { </span><span style="color: #0000ff;"&gt;var</span> resut =<span style="color: #000000;"&gt; Request.Form; </span><span style="color: #0000ff;"&gt;return</span> Json(<span style="color: #0000ff;"&gt;new</span> { _code = <span style="color: #800080;"&gt;200</span>,_msg = <span style="color: #800000;"&gt;"</span><span style="color: #800000;"&gt;Login success</span><span style="color: #800000;"&gt;"</span>,name = userName,password =<span style="color: #000000;"&gt; userPwd }); } }</span></pre>

$.post

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

$.post(~/Account/Login,{ userName: ,userPwd:

响应

这里我们看一下请求体

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

Meta IT怪O 用户登录 dist/css/bootstrap.css" cope) { $scope.Login cope.userName,userPwd: $scope.userPwd };
            </span><span style="background-color: #f5f5f5; color: #0000ff;"&gt;var</span><span style="background-color: #f5f5f5; color: #000000;"&gt; con<a href="https://www.jb51.cc/tag/fig/" target="_blank" class="keywords">fig</a> </span><span style="background-color: #f5f5f5; color: #000000;"&gt;=</span><span style="background-color: #f5f5f5; color: #000000;"&gt; {
                headers: { </span><span style="background-color: #f5f5f5; color: #000000;"&gt;'</span><span style="background-color: #f5f5f5; color: #000000;"&gt;Content-Type</span><span style="background-color: #f5f5f5; color: #000000;"&gt;'</span><span style="background-color: #f5f5f5; color: #000000;"&gt;: </span><span style="background-color: #f5f5f5; color: #000000;"&gt;'</span><span style="background-color: #f5f5f5; color: #000000;"&gt;application/x-www-form-urlencoded</span><span style="background-color: #f5f5f5; color: #000000;"&gt;'</span><span style="background-color: #f5f5f5; color: #000000;"&gt; },</span><span style="background-color: #f5f5f5; color: #008000;"&gt;//</span><span style="background-color: #f5f5f5; color: #008000;"&gt;transformRequest: function (obj) {</span>
                <span style="background-color: #f5f5f5; color: #008000;"&gt;//</span><span style="background-color: #f5f5f5; color: #008000;"&gt;    var str = [];</span>
                <span style="background-color: #f5f5f5; color: #008000;"&gt;//</span><span style="background-color: #f5f5f5; color: #008000;"&gt;    for (var p in obj) {</span>
                <span style="background-color: #f5f5f5; color: #008000;"&gt;//</span><span style="background-color: #f5f5f5; color: #008000;"&gt;        str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));</span>
                <span style="background-color: #f5f5f5; color: #008000;"&gt;//</span><span style="background-color: #f5f5f5; color: #008000;"&gt;    }</span>
                <span style="background-color: #f5f5f5; color: #008000;"&gt;//</span><span style="background-color: #f5f5f5; color: #008000;"&gt;    return str.join("&amp;");</span>
                <span style="background-color: #f5f5f5; color: #008000;"&gt;//</span><span style="background-color: #f5f5f5; color: #008000;"&gt;}</span>

<span style="background-color: #f5f5f5; color: #000000;"> };
console.log(data);
$http.post(<span style="background-color: #f5f5f5; color: #000000;">"<span style="background-color: #f5f5f5; color: #000000;">@Url.Content(<span style="background-color: #f5f5f5; color: #000000;">"<span style="background-color: #f5f5f5; color: #000000;">~<span style="background-color: #f5f5f5; color: #000000;">/<span style="background-color: #f5f5f5; color: #000000;">Account<span style="background-color: #f5f5f5; color: #000000;">/<span style="background-color: #f5f5f5; color: #000000;">Login<span style="background-color: #f5f5f5; color: #000000;">"<span style="background-color: #f5f5f5; color: #000000;">)<span style="background-color: #f5f5f5; color: #000000;">"<span style="background-color: #f5f5f5; color: #000000;">,data,config).success(<span style="background-color: #f5f5f5; color: #0000ff;">function<span style="background-color: #f5f5f5; color: #000000;"> (data) {
console.log(data);
});
};

    });
</span><span style="color: #0000ff;"&gt;</</span><span style="color: #800000;"&gt;script</span><span style="color: #0000ff;"&gt;></span>

<span style="color: #0000ff;"></<span style="color: #800000;">head<span style="color: #0000ff;">>
<span style="color: #0000ff;"><<span style="color: #800000;">body<span style="color: #0000ff;">>
<span style="color: #0000ff;"><<span style="color: #800000;">div <span style="color: #ff0000;">ng-controller<span style="color: #0000ff;">="LoginController"<span style="color: #0000ff;">>
<span style="color: #0000ff;"><<span style="color: #800000;">input <span style="color: #ff0000;">type<span style="color: #0000ff;">="text"<span style="color: #ff0000;"> placeholder<span style="color: #0000ff;">="用户名"<span style="color: #ff0000;"> ng-model<span style="color: #0000ff;">="userName"<span style="color: #ff0000;"> value<span style="color: #0000ff;">="" <span style="color: #0000ff;">/>
<span style="color: #0000ff;"><<span style="color: #800000;">input <span style="color: #ff0000;">type<span style="color: #0000ff;">="password"<span style="color: #ff0000;"> placeholder<span style="color: #0000ff;">="密码"<span style="color: #ff0000;"> ng-model<span style="color: #0000ff;">="userPwd"<span style="color: #ff0000;"> value<span style="color: #0000ff;">="" <span style="color: #0000ff;">/>
<span style="color: #0000ff;"><<span style="color: #800000;">button <span style="color: #ff0000;">ng-click<span style="color: #0000ff;">="Login()"<span style="color: #0000ff;">>登录<span style="color: #0000ff;"></<span style="color: #800000;">button<span style="color: #0000ff;">>
<span style="color: #0000ff;"></<span style="color: #800000;">div<span style="color: #0000ff;">>
<span style="color: #0000ff;"></<span style="color: #800000;">body<span style="color: #0000ff;">>
<span style="color: #0000ff;"></<span style="color: #800000;">html<span style="color: #0000ff;">>

登录

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

看到没?差别就在这里

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

fig = { 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相同了。

可以在全局进行设置