谁能告诉我为什么以下声明不会将发布数据发送到指定的网址?当我打印$ _POST时,在服务器上调用url - 我得到一个空数组.如果我在将数据添加到数据之前在控制台中打印消息 - 它会显示正确的内容.
$http.post('request-url', { 'message' : message });
Run Code Online (Sandbox Code Playgroud)
我也尝试将数据作为字符串(具有相同的结果):
$http.post('request-url', "message=" + message);
Run Code Online (Sandbox Code Playgroud)
当我以下列格式使用它时它似乎正在工作:
$http({
method: 'POST',
url: 'request-url',
data: "message=" + message,
headers: {'Content-Type': 'application/x-www-form-urlencoded'}
});
Run Code Online (Sandbox Code Playgroud)
但有没有办法用$ http.post()来做 - 并且我总是必须包含标题才能使它工作?我相信上面的内容类型是指定发送数据的格式,但我可以将其作为javascript对象发送吗?
我看一下Angular API for $ resource,我没有找到一些方法来发送Request Body一个RESTful服务.
我知道这可以使用$ http方法,就像这里一样,所以,它是否也可以使用$resource?
显然这是可供选择的$resource.
action - {string} - 操作的名称.此名称将成为资源对象上方法的名称.
method - {string} - HTTP请求方法.有效的方法是:GET,POST,PUT,DELETE和JSONP
params - {object =} - 此操作的可选预绑定参数集.
isArray - {boolean =} - 如果为true,则此操作的返回对象是数组,请参阅返回部分.
目前我没有找到任何方式来发送包含JSON对象的请求有效负载.
我们需要在更新/创建一些数据后向用户显示错误/成功消息,这是一种常见的情况,我们如何在AngularJS中实现它?
我想添加回调但无法找到解决方案.使用$ http.post().success().error()有效,但我想知道我是否可以使用更高的杠杆API $资源.
或者,我们应该写指令或使用$ watch()?
感谢您的帮助.
为了发送OAuth2令牌,我在AngularJS上设置默认标头,如下所示:
$http.defaults.headers.common['Authorization'] = 'Bearer ' + access_token;
Run Code Online (Sandbox Code Playgroud)
这工作得很好但我不需要这个标题(我得到一个错误)一个特定的请求.
有没有办法在执行该请求时排除默认标头?
谢谢!
感谢Riron让我走上了正确的道路.这是答案:
$http({
method: 'GET',
url: 'http://.../',
transformRequest: function(data, headersGetter) {
var headers = headersGetter();
delete headers['Authorization'];
return headers;
}
});
Run Code Online (Sandbox Code Playgroud) 请参阅此处接受的答案,以获得有关transFormRequest函数/数组的相当好的解释.
在答案的最后一个例子中:
var transform = function(data){
return $.param(data);
}
$http.post("/foo/bar", requestData, {
headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'},
transformRequest: transform
}).success(function(responseData) {
//do stuff with response
});
Run Code Online (Sandbox Code Playgroud)
但是,问题在于transformRequest: transform覆盖了Angular预先构建的函数数组.
来自Angular 文档:
要全局扩充或覆盖默认转换,请修改$ httpProvider.defaults.transformRequest和$ httpProvider.defaults.transformResponse属性.默认情况下,这些属性是一个转换函数数组,允许您将新转换函数推送或取消转换到转换链中.您还可以通过直接将转换函数分配给这些属性来决定完全覆盖任何默认转换,而无需使用数组包装器.这些默认值在运行时在$ http工厂上再次可用,如果您希望参与转换,则这可能很有用.
类似地,要在本地覆盖请求/响应转换,请扩充传递到$ http的配置对象的transformRequest和/或transformResponse属性.
如果我想全局应用我的转换函数,我会这样做
$httpProvider.defaults.transformRequest.unshift(myFunction)
Run Code Online (Sandbox Code Playgroud)
要么
$httpProvider.defaults.transformRequest.push(myFunction)
Run Code Online (Sandbox Code Playgroud)
我的问题
而不是删除整个转换请求函数数组,如何将另一个转换函数推送到一个调用,而不是全局?
我想在 $ resource构造url 之前以编程方式更改路由参数.我无法使用angular的http拦截器来执行此操作,因为此时路由已经连接在一起.
给出一个Assortment.model.js
module.exports = function($resource) {
return $resource("", {}, {
get: {
url: "/assortment/:model/:id",
method: "GET",
params: {id: "@id", model: "@model"} //< this needs to be uppercase
}
});
};
Run Code Online (Sandbox Code Playgroud)
......和一些controller.js
["Supplier", function(Supplier) {
Supplier.Assortment.get({ id: 5, model: "user" })
}]
Run Code Online (Sandbox Code Playgroud)
如何强制执行始终转换{model: "user"}为的挂钩{model: "User"}
javascript angularjs angularjs-resource ngresource angularjs-http
我正在创建两个POST调用.一个使用django形式,一个使用角度js通过资源xhr.
角度设置如下所示:
myModule.factory('gridData', function($resource) {
//define resource class
var root = {{ root.pk }};
var csrf = '{{ csrf_token }}';
return $resource('{% url getJSON4SlickGrid root.pk %}:wpID/', {wpID:'@id'},{
get: {method:'GET', params:{}, isArray:true},
update:{method:'POST', headers: {'X-CSRFToken' : csrf }}
});
});
Run Code Online (Sandbox Code Playgroud)
通过创建xhr post请求:
item.$update();
Run Code Online (Sandbox Code Playgroud)
此post请求按预期发送到服务器,但是当我想访问QueryDict时,我无法访问传递的数据:
name = request.POST.get('name', None)
Run Code Online (Sandbox Code Playgroud)
name总是None这样.
这背后的问题是QueryDict对象被解析得很奇怪.
print request.POST
<QueryDict: {u'{"name":"name update","schedule":0"}':[u'']}>
Run Code Online (Sandbox Code Playgroud)
虽然我会期望这个结果,当我通过"正常"的Post请求发送数据时,我得到了这个结果:
<QueryDict: {u'name': [u'name update'], u'schedule': [u'0']}>
Run Code Online (Sandbox Code Playgroud)
所以似乎Django在POST请求中收到一些东西,指示Django将参数解析为一个字符串.知道如何规避这个吗?
更新:
我发现这个讨论,他们说问题是如果你提供除MULTIPART_CONTENT以外的任何内容类型,参数将被解析为一个字符串.我检查了内容类型发送与POST请求,它确实设置为'CONTENT_TYPE': 'application/json;charset=UTF-8'.因此,这可能是问题所在.因此我的问题是:如何为使用angular.js资源创建的xhr post请求设置CONTENT_TYPE MULTIPART_CONTENT?
这是我的流程:主页面位于'/ main'网址,因此当用户访问该页面时,我的Web服务器返回一个静态html:
<!DOCTYPE html>
<html ng-app="sam">
<head>
<link rel="stylesheet" type="text/css" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
</head>
<body>
<div ng-controller="BuildingsController as buildings">
<button ng-click="RefreshBuildings()">Refresh</button>
<h1>{{buildings.elements.length}}</h1>
<table>
<tr>
<th>id</th>
<th>name</th>
<th>last_updated</th>
<th>based_on_file</th>
</tr>
<tr ng-repeat="element in buildings.elements | orderBy:'-id'">
<td>{{element.id}}</td>
<td><a ng-href="/getTenants?buildingId={{element.id}}">{{element.name}}</a></td>
<td>{{element.last_updated | date}}</td>
<td>{{element.based_on_file}}</td>
<td><button ng-click="buildings.UpdateDataBase(element.id)">Refresh</button></td>
</tr>
</table>
</div>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.13/angular.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript" src="app.js"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
这是js文件:
(function(){
var app = angular.module('sam', []);
app.controller('BuildingsController', ['$http','$log', function($http, $log){
//Update scope pramaters
this.RefreshGui = function(elements){
this.elements = elements
};
//call server to …Run Code Online (Sandbox Code Playgroud) angularjs ×8
javascript ×2
post ×2
angular-http ×1
callback ×1
django ×1
html ×1
http-headers ×1
jquery ×1
ngresource ×1
request ×1
resources ×1