当前位置: 首页 > 面试题库 >

AngularJS-$ http.post是否可以发送请求参数而不是JSON?

羊舌富
2023-03-14
问题内容

我有一些旧代码通过jQuery的post方法发出AJAX
POST请求,看起来像这样:

$.post("/foo/bar", requestData,
    function(responseData)
    {
        //do stuff with response
    }

requestData 只是具有一些基本字符串属性的javascript对象。

我正在移动我们的内容以使用Angular,并且我想用$ http.post代替此调用。我提出以下内容:

$http.post("/foo/bar", requestData).success(
    function(responseData) {
        //do stuff with response
    }
});

当我这样做时,我从服务器收到500错误响应。使用Firebug,我发现这发送了如下请求体:

{"param1":"value1","param2":"value2","param3":"value3"}

成功的jQuery $.post发送如下内容:

param1=value1&param2=value2&param3=value3

我要命中的端点期望请求参数而不是JSON。因此,我的问题是无论如何要告诉$http.post发送JavaScript对象作为请求参数而不是JSON?是的,我知道我可以自己从对象构造字符串,但是我想知道Angular是否为此提供了开箱即用的功能。


问题答案:

我认为paramsconfig参数在这里不起作用,因为它将字符串添加到url而不是正文中,但是要添加到Infeligo建议的内容中,这是默认转换的全局替代示例(使用jQuery
param作为转换示例数据到参数字符串)。

设置全局transformRequest函数:

var app = angular.module('myApp');

app.config(function ($httpProvider) {
    $httpProvider.defaults.transformRequest = function(data){
        if (data === undefined) {
            return data;
        }
        return $.param(data);
    }
});

这样,所有对$ http.post的调用都会自动将主体转换为jQuery $.post调用所使用的相同参数格式。

请注意,您可能还希望按以下方式为每次调用或全局设置Content-Type标头:

$httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';

每个调用的示例非全局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
    });


 类似资料:
  • 但是,有没有一种方法可以使用$http.post()来实现这一点?我是否必须始终包含头部才能使其工作?我相信上面的内容类型指定了发送数据的格式,但是我可以将它作为javascript对象发送吗?

  • 问题内容: 谁能告诉我以下语句为什么不将帖子数据发送到指定的URL?调用了url,但是在打印$ _POST时在服务器上- 我得到一个空数组。如果我在将消息添加到数据之前在控制台中打印消息-它显示正确的内容。 我也尝试过将数据作为字符串(具有相同的结果): 当我以以下格式使用它时,它似乎可以正常工作: 但是有没有办法用$ http.post()做到这一点- 我是否总是必须包含标头才能使其正常工作?我

  • 首先,我不想在这个事务中与服务器交互。我正在使用FetchAPI发送请求,但在url中我想传递一个js文件。像这样的- 此外,如果有可能,我们可以只使用JS获取POST变量吗? 我知道这样做似乎没有任何意义。但我正在尝试一些东西,非常感谢任何帮助。

  • 问题内容: 我想在过滤器/ servlet中拦截请求,并向其中添加一些参数。但是,该请求不会公开’setParameter’方法,并且该参数映射在被操纵时会抛出错误,表明已被锁定。有没有其他我可以尝试的方法? 问题答案: 子类化并覆盖方法。该类的描述为: 提供HttpServletRequest接口的便捷实现,希望希望使请求适应Servlet的开发人员可以将其子类化。 在过滤器中,将请求包装在子类

  • 我试图做简单的超文本传输协议后请求使用以下代码:Golang代码从另一个SO后 它发送了两次http请求(我尝试了向自己的web服务和Firebase消息服务器发送)。有人知道怎么回事吗?非常感谢。 编辑忽略我,找出是AVG反病毒造成的问题。如果我这样做:然后按enter键一次,AVG会中断,说它已经扫描了它,然后让它运行。这会导致http调用两次。如果我在运行前禁用了防病毒软件,那么http请求

  • 问题内容: 我正在使用HttpClient发出发布请求。我回到405方法不被允许。在提琴手中捕获轨迹时,它作为GET而不是POST发出! 我知道异步/等待问题。这是显示问题的简化示例。 是否存在某种可能会影响此的web.config或machine.config设置?其他请求(通过RestSharp发送)正确发送了帖子 这是提琴手捕获的东西。在提琴手中运行跟踪也会返回405(如预期)。手动将其切换