【问题标题】:AngularJS POST JSON to Django REST APIAngularJS POST JSON 到 Django REST API
【发布时间】:2014-07-11 10:01:07
【问题描述】:

我正在使用 AngularJS 构建一个应用程序,并使用由 Django 制作的外部 API。

对于 API 调用,我使用的是 Restangular(但事实并非如此,因为即使使用 $http 我也会得到相同的结果)。

我的 post call 的默认内容类型是:

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

这样做只是为了让我可以在登录 win OAuth2 时发送凭据:

var data = {
    grant_type: 'password',
    client_id: clientID,
    client_secret: clientSecret,
    username: username,
    password: password
};

$http.post('http://server.com/api/oauth2/access_token/', data);

GET 是使用默认的 AngularJS 配置完成的(我猜是 application/json)。

到目前为止一切顺利,直到...我发出 POST 请求并发送大型 JSON 对象。

上面的配置不起作用,所以我将那些 POST 请求更改为 application/json,并得到错误响应:

400: JSON parse error - No JSON object could be decoded

仅使用 jQuery 进行了相同的尝试 - 尽管我必须执行 JSON.strigify 并且在 Chrome Request Payload 上进行错误调试,但它仍然有效,使用 jQuery 看起来像一个合适的对象,而使用 AngularJS 看起来像这样:

type=Feature&geometry=%5Bobject%20Object%5D&properties=%5Bobject%20Object%5D

(是的,顺便说一下,我正在发送一个有效的 GeoJSON 对象)

所以我认为 JSON.stringify 可能与此有关,但在将其应用于我的对象后,来自 AngularJS 的请求有效负载是一团糟:

0=%7B&1=%22&2=t&3=y&4=p&5=e&6=%22&7=%3A&8=%22&9=F&10=e&11=a&12=t&13=u&14=r&15=e&16=%22&17=%2C&18=%22&19=g&20=e&21=o&22=m&23=e&24=t&25=r&26=y&27=%22&28=%3A&29=%7B&30=%22&31=t&32=y&33=p&34=e&35=%22&36=%3A&37=%22&38=P&39=o&40=i&41=n&42=t&43=%22&44=%2C&45=%22&46=c&47=o&48=o&49=r&50=d&51=i&52=n&53=a&54=t&55=e&56=s&57=%22&58=%3A&59=%5B&60=1&61=9&62=.&63=0&64=8&65=3&66=2&67=4&68=1&69=2&70=2&71=4&72=2&73=8&74=8&75=9&76=%2C&77=5&78=0&79=.&80=2&81=4&82=2&83=4&84=0&85=2&86=0&87=7&88=2&89=3&90=6&91=8&92=9&93=%5D&94=%7D&95=%2C&96=%22&97=p&98=r&99=o&100=p&101=e&102=r&103=t&104=i&105=e&106=s&107=%22&108=%3A&109=%7B&110=%22&111=c&112=o&113=n&114=t&115=r&116=i&117=b&118=u&119=t&120=i&121=o&122=n&123=t&124=y&125=p&126=e&127=%22&128=%3A&129=1&130=2&131=1&132=4&133=5&134=%2C&135=%22&136=l&137=o&138=c&139=a&140=t&141=i&142=o&143=n&144=%22&145=%3A&146=%7B&147=%22&148=n&149=a&150=m&151=e&152=%22&153=%3A&154=%22&155=D&156=a&157=n&158='&159=s&160=%20&161=H&162=o&163=u&164=s&165=e&166=%22&167=%2C&168=%22&169=d&170=e&171=s&172=c&173=r&174=i&175=p&176=t&177=i&178=o&179=n&180=%22&181=%3A&182=n&183=u&184=l&185=l&186=%2C&187=%22&188=s&189=t&190=a&191=t&192=u&193=s&194=%22&195=%3A&196=n&197=u&198=l&199=l&200=%2C&201=%22&202=c&203=r&204=e&205=a&206=t&207=e&208=d&209=_&210=a&211=t&212=%22&213=%3A&214=%22&215=2&216=0&217=1&218=4&219=-&220=0&221=4&222=-&223=3&224=0&225=T&226=1&227=0&228=%3A&229=2&230=4&231=%3A&232=5&233=8&234=.&235=9&236=3&237=7&238=Z&239=%22&240=%2C&241=%22&242=i&243=d&244=%22&245=%3A&246=4&247=5&248=%7D&249=%7D&250=%7D

有什么帮助吗?我做错了什么?或者它与 Django API 有关?我们应该改变它吗?

已解决

问题是由序列化程序引起的(我对 jQuery 的 $.param 的解释)。显然我需要这个来发送 OAuth2 的凭据,但不需要发送任何其他 POST 请求。

虽然我还是不知道为什么会这样。

【问题讨论】:

  • 您是否在浏览器开发人员工具中检查了发送给 Django 的内容?
  • 所以这是作为字符串发送的 type=Feature&geometry=%5Bobject%20Object%5D&properties=%5Bobject%20Object%5D 尽管在使用 jQuery 时,响应负载是一个对象。

标签: django angularjs restangular


【解决方案1】:

试试这个

   var data = {
        grant_type: 'password',
        client_id: clientID,
        client_secret: clientSecret,
        username: username,
        password: password
    };

    $http.post('http://server.com/api/oauth2/access_token/', angular.toJson(data));

【讨论】:

    【解决方案2】:

    包含 jquery 并尝试一下

    $http({
        method: 'POST', 
        url: 'http://server.com/api/oauth2/access_token/', 
        data: $.param(data)
    });
    

    【讨论】:

    • 好吧,我不想在使用 AngularJS 时使用 jQuery,而且 $.param 也是我收到错误的原因(它已经作为 SOLVED 发布了)。
    • 哦,很抱歉,我在发布答案后看到了已解决的编辑:(。
    猜你喜欢
    • 2016-12-26
    • 1970-01-01
    • 2016-02-11
    • 2015-04-17
    • 1970-01-01
    • 2016-02-20
    • 2015-03-23
    • 2015-03-22
    • 1970-01-01
    相关资源
    最近更新 更多