POST POST xml时如何通过Google访问令牌

时间:2014-03-13 12:48:37

标签: jquery ajax cordova

首先,我知道如何使用访问令牌(例如

)对Google进行典型的POST
$.post('https://accounts.google.com/o/oauth2/token', {
            refresh_token: localStorage.refresh_token,
            client_id: my_client_id,
            grant_type: 'refresh_token'
        }).done(...}).fail(...});

但是,现在我尝试在Google电子表格中插入一行。这里有两种情况。

  1. 用户点击'使用Google登录'并使用Google凭据进行身份验证。我的应用程序然后发送POST请求以将行插入其Google云端硬盘上的电子表格中。这当前没有问题(即行IS被插入到电子表格中)。
  2. 我没有让用户进行身份验证,而是使用存储在服务器上的刷新令牌为其帐户获取访问令牌。然后,我执行与(1)中完全相同的POST请求,但它无声地失败。
  3. 所以看起来好像第一个场景是在幕后进行一些我不在(2)中复制的配置。 SpreadSheet API上的文档说我需要设置一个授权标题,以便将此行提交到电子表格。我不知道该怎么做(我希望文档在那里给出一个例子),但看起来我可以使用jQuery beforeSend中的ajax设置手动设置标题方法。要提交到电子表格,请求的contentType必须为application/atom+xml,这意味着我需要使用$.ajax()而不是更简单的$.post()(我认为)。

    要清楚,当我通过正式登录过程获取访问令牌(我目前不在请求中使用)时,一切都很有效。但它在第二种情况下不起作用。

    我使用Postman跟踪了一个类似的POST请求并查看了标题和cookie以查看是否有任何授权标题,但我没有看到它。我现在已经查看了一天中的大量信息,并且无法弄清楚我到底需要做什么。

    如果重要,请求来自PhoneGap Android应用程序。

    如何将标头设置为正确的凭据?

    这是我的代码:

    function postRowFromDatabaseToGoogleSpreadsheet(row) {
    var spreadsheetApiUrl = "https://spreadsheets.google.com/feeds/list/myspreadsheet-key/1/private/full";
    
    var xml = "<entry xmlns='http://www.w3.org/2005/Atom' " +
            "xmlns:gsx='http://schemas.google.com/spreadsheets/2006/extended'>" +
            "<gsx:{0}>{1}</gsx:{0}>".format("id", row.id) +
            "<gsx:{0}>{1}</gsx:{0}>".format("coverage", row.coverage) +
            "<gsx:{0}>{1}</gsx:{0}>".format("date", row.date) +
            "<gsx:{0}>{1}</gsx:{0}>".format("time", row.time) +
            "<gsx:{0}>{1}</gsx:{0}>".format("comments", row.comments) +
            "<gsx:{0}>{1}</gsx:{0}>".format("kwhr", row.kwhr) +
            "<gsx:{0}>{1}</gsx:{0}>".format("mlwater", row.mlwater) +
            "<gsx:{0}>{1}</gsx:{0}>".format("tabletid", row.tabletid) +
            "</entry>";
    
    console.log("Submitting to URI: " + spreadsheetApiUrl);
    console.log("Xml to submit: \n" + xml);
    
    $.ajax({
        type: "POST",
        //headers: 
        beforeSend: function(xhr) {
            console.log("beforeSend");
            console.log(xhr);
    
            xhr.done(function() {
                console.log(xhr.responseText);
                console.log(xhr.getAllResponseHeaders());
            }).fail(function() {
                console.log("xhr failed...");
            });
        },
        url: spreadsheetApiUrl,
        data: xml,
        contentType: "application/atom+xml",
        crossDomain: true 
    }).done(function(response) {
        console.log("post succeeded");
        if (response == null) {
            console.log("response was null");
        } else {
            console.log(response);
        }
    }).fail(function(error) {
        console.log("post failed");
        console.log(error);
    }).always(function() {
        console.log("post completed");
    });
    }
    

1 个答案:

答案 0 :(得分:0)

发现您可以在网址中传递令牌或作为标头传递令牌。

要传入网址,请在网址中添加参数access_token={Your token here}

$.ajax({
    type: "POST",
    headers: {
        Authorization: "Bearer " + localStorage.access_token
    },
    url: url,
    data: {},
    contentType: "application/json"
})
.done(function(response) {
   // snip
})
.fail(function(error) {
    //snip
})