首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript相当于Python提醒的oauth2client帖子请求

JavaScript相当于Python提醒的oauth2client帖子请求
EN

Stack Overflow用户
提问于 2019-12-12 10:49:29
回答 1查看 146关注 0票数 1

我想将这个用于谷歌提醒的开源Python库移植到JavaScript:

https://github.com/jonahar/google-reminders-cli

我已经在https://developers.google.com/identity/protocols/OAuth2UserAgent的帮助下移植了授权

我的JavaScript版本:https://github.com/Jinjinov/google-reminders-js

现在,我需要移植Python的oauth2client POST请求:

代码语言:javascript
复制
body = {
    '5': 1,  # boolean field: 0 or 1. 0 doesn't work ¯\_(ツ)_/¯
    '6': num_reminders,  # number number of reminders to retrieve
}

HEADERS = {
    'content-type': 'application/json+protobuf',
}

    response, content = self.auth_http.request(
        uri='https://reminders-pa.clients6.google.com/v1internalOP/reminders/list',
        method='POST',
        body=json.dumps(body),
        headers=HEADERS,
    )

我的XMLHttpRequest POST请求返回:

如果我使用'application/x-www-form-urlencoded'

  • HTTP 401 -未经授权-如果我使用'application/json'

  • HTTP 400 -糟糕的请求

我的代码(带有授权和访问令牌的完整代码在GitHub上):

代码语言:javascript
复制
function encodeObject(params) {
    var query = [];
    for (let key in params) {
      let val = encodeURIComponent(key) + "=" + encodeURIComponent(params[key]);
      query.push(val);
    }
    return query.join('&');
}

function list_reminders(num_reminders, access_token, callback) {

    var body = {
        '5': 1,  // boolean field: 0 or 1. 0 doesn't work ¯\_(ツ)_/¯
        '6': num_reminders,  // number of reminders to retrieve
    };

    body['access_token'] = access_token;

    //body = JSON.stringify(body);
    body = encodeObject(body);

    var xhr = new XMLHttpRequest();

    xhr.open('POST', 'https://reminders-pa.clients6.google.com/v1internalOP/reminders/list' + '?' + body);
    xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');

    //xhr.open('POST', 'https://reminders-pa.clients6.google.com/v1internalOP/reminders/list');
    //xhr.setRequestHeader('Content-type', 'application/json');

    xhr.onreadystatechange = function (e) {
        if (xhr.readyState === 4 && xhr.status === 200) {
            var content_dict = JSON.parse(xhr.response);

            if (!('1' in content_dict)) {
                console.log('No reminders found');
            }
            else {
                var reminders_dict_list = content_dict['1'];
                var reminders = [];

                for(var reminder_dict of reminders_dict_list) {
                    reminders.push(build_reminder(reminder_dict));
                }

                callback(reminders);
            }
        }
        else if (xhr.readyState === 4 && xhr.status === 401) {
            callback(null);
        }
    }

    //xhr.send(body);
    xhr.send(null);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-15 19:15:41

我试着用同样的方式发送身体和访问令牌。

解决方案是以url编码发送访问令牌,以json的形式发送主体:

代码语言:javascript
复制
function list_reminders(num_reminders, access_token, callback) {
    /*
    returns a list of the last num_reminders created reminders, or
    None if an error occurred
    */

    var xhr = new XMLHttpRequest();

    xhr.open('POST', 'https://reminders-pa.clients6.google.com/v1internalOP/reminders/list' + '?' + 'access_token=' + access_token);
    xhr.setRequestHeader('Content-type', 'application/json+protobuf');

    xhr.onreadystatechange = function (e) {
        if (xhr.readyState === 4 && xhr.status === 200) {
            var content_dict = JSON.parse(xhr.response);

            if (!('1' in content_dict)) {
                console.log('No reminders found');
            }
            else {
                var reminders_dict_list = content_dict['1'];
                var reminders = [];

                for(var reminder_dict of reminders_dict_list) {
                    reminders.push(build_reminder(reminder_dict));
                }

                callback(reminders);
            }
        }
        else if (xhr.readyState === 4 && xhr.status === 401) {
            callback(null);
        }
    }

    var body = {
        '5': 1,  // boolean field: 0 or 1. 0 doesn't work ¯\_(ツ)_/¯
        '6': num_reminders,  // number of reminders to retrieve
    };

    xhr.send(JSON.stringify(body));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59302894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档