在Chrome扩展程序中向Tumblr的API发出POST请求

时间:2012-05-13 02:08:34

标签: post oauth google-chrome-extension tumblr

我正在尝试使用他们的API和chrome_ex_oauth向Tumblr发帖。

获得授权作品的整个过程。我无法工作的是做一个POST。我正在做以下事情:

编辑:我已更新代码以反映Rob W关于身体字段的正确建议

var stringify = function (parameters) {
  var params = [];
  for(var p in parameters) {
    params.push(encodeURIComponent(p) + '=' +
                encodeURIComponent(parameters[p]));
  }
  return params.join('&');
};

var onAuthorized = function() {
  var url = 'http://api.tumblr.com/v2/blog/jindie.tumblr.com/post';
  var request = {
    'method': 'POST',
    'headers':{
      'Content-Type':'application/x-www-form-urlencoded'
    },
    'body': stringify({
      'type': 'text',
      'state': 'draft',
      'title': 'Test post...',
      'body': 'Hello, World!'
    })
  };

  oauth.sendSignedRequest(url, function(responseText, xhr){alert(responseText);}, request);
};

oauth.authorize(onAuthorized);

我一直在检查代码,并思考可能出现的问题,但我真的不知道。你呢?

你知道我哪里出错吗?

1 个答案:

答案 0 :(得分:3)

如果文档无法查看源代码,chrome_ex_oauth.js

您必须使用'body'代替'parameters'

var request = {
  'method': 'POST',
  'body': {

调试

为了找到原因,我按照这些步骤(注释了我的想法):

  1. 显然,帖子的身体是空的。因此,API的实现必定是错误的。
  2. Ctrl + F sendSignedRequest

    ChromeExOAuth.prototype.sendSignedRequest = function(url, callback, opt_params) {
      var method = opt_params && opt_params['method'] || 'GET';
      var body = opt_params && opt_params['body'] || null;
      var params = opt_params && opt_params['parameters'] || {};
      var headers = opt_params && opt_params['headers'] || {};
    var signedUrl = this.signURL(url, method, params);
    // Hmm...? Where is `params` being passed...? ChromeExOAuth.sendRequest(method, signedUrl, headers, body, function (xhr) { if (xhr.readyState == 4) { callback(xhr.responseText, xhr); } }); };
  3. signURL不会修改params,因此这不是问题。
  4. Ctrl + F sendRequest
    ChromeExOAuth.sendRequest = function(method, url, headers, body, callback) {
      var xhr = new XMLHttpRequest();
      xhr.onreadystatechange = function(data) {
        callback(xhr, data);
      }
      xhr.open(method, url, true);
      if (headers) { . . . }
      xhr.send(body); // <-- !!!
    };
  5. 知道了!必须使用 body代替parameters
  6. body变量回溯到 request['body'] (参见2)。