我们如何获得和发布钛合金api?

时间:2014-11-06 06:44:49

标签: titanium

我们如何在钛合金中获取和发布api?

我正在使用userDetails的api,我只想知道如何编码从api获取数据。

function getUserDetails(){

}

提前致谢。

2 个答案:

答案 0 :(得分:1)

如您所述,您使用的是钛合金。

另一种方法是扩展Alloy的模型和集合(基于backbone.js概念)。

RestAPI Sync Adapter已经有一些实施,Titanium RestApi sync也有正确的描述/用法。

我还提供了所使用的说明和方法,案例链接被破坏了:

创建模型:Alloy模型是Backbone.js模型的扩展,因此当您定义有关数据的特定信息时,可以通过实现所有Backbone模型通用的某些方法来实现因此,重写父方法。在这里,我们将覆盖骨干的url()方法以允许我们的自定义url端点。

路径: /app/models/node.js

exports.definition = {
  config: {
    adapter: {
      type: "rest",
      collection_name: "node"
    }
  },
  extendCollection: function(Collection) {
    _.extend(Collection.prototype, {
      url: function() {
        return "http://www.example.com/ws/node";
      },
    });
    return Collection;
  }
};

配置REST同步适配器:同步适配器的主要目的是使用提取数据的内容覆盖Backbone的默认同步方法。在我们的示例中,在调用函数以使用Ti.Network.createHTTPClient()调用获取数据之前,我们将执行一些完整性检查。这将创建一个对象,我们可以将标题和处理程序附加到并最终打开并向我们的服务器发送xml http请求,以便我们可以获取数据并将其应用到我们的集合中。

路径: /app/assets/alloy/sync/rest.js(您可能必须先创建合金/同步文件夹)

// Override the Backbone.sync method with our own sync 
functionmodule.exports.sync = function (method, model, opts)
{
  var methodMap = {
  'create': 'POST',
  'read': 'GET',
  'update': 'PUT',
  'delete': 'DELETE'
  };
  var type = methodMap[method];
  var params = _.extend(
  {}, opts);
  params.type = type;
  //set default headers    
  params.headers = params.headers || {};
  // We need to ensure that we have a base url.    
  if (!params.url)
  {
    params.url = model.url();
    if (!params.url)
    {
      Ti.API.error("[REST API] ERROR: NO BASE URL");
      return;
    }
  }
  //json data transfers    
  params.headers['Content-Type'] = 'application/json';
  switch (method)
  {
    case 'delete':
    case 'create':
    case 'update':
      throw "Not Implemented";
    break;
    case 'read':
      fetchData(params, function (_response)
      {
        if (_response.success)
        {
          var data = JSON.parse(_response.responseText);
          params.success(data, _response.responseText);
        }
        else
        {
          params.error(JSON.parse(_response.responseText), _response.responseText);
          Ti.API.error('[REST API] ERROR: ' + _response.responseText);
        }
      });
    break;
  }
};

function fetchData(_options, _callback)
{
  var xhr = Ti.Network.createHTTPClient(
  {
    timeout: 5000
  });
  //Prepare the request    
  xhr.open(_options.type, _options.url);
  xhr.onload = function (e)
  {
    _callback(
    {
      success: true,
      responseText: this.responseText || null,
      responseData: this.responseData || null
    });
  };
  //Handle error    
  xhr.onerror = function (e)
  {
    _callback(
    {
      'success': false,
      'responseText': e.error
    });
    Ti.API.error('[REST API] fetchData ERROR: ' + xhr.responseText);
  };
  for (var header in _options.headers)
  {
    xhr.setRequestHeader(header, _options.headers[header]);
  }
  if (_options.beforeSend)
  {
    _options.beforeSend(xhr);
  }
  xhr.send(_options.data || null);
}

//we need underscore
var _ = require("alloy/underscore")._;

为模型 - 视图绑定设置视图:Titanium有一个名为模型 - 视图绑定的功能,它允许您在集合中的每个模型的视图的一部分中创建可重复对象。在我们的示例中,我们将使用TableView元素,dataCollection属性设置为node,这是我们模型的名称,我们将在其中创建一个TableViewRow元素。基于行的元素将神奇地重复集合中的每个项目。

路径: /app/views/index.xml

<Alloy>
  <Collection src="node">
    <Window class="container">
      <TableView id="nodeTable" dataCollection="node">
        <TableViewRow title="{title}" color="black" />
      </TableView>
    </Window>
</Alloy>

最后控制器:将模型绑定到视图几乎不需要控制器级别的代码,我们唯一需要做的就是加载我们的集合并启动一个获取命令,数据将是准备被绑定到视图。

路径: /app/controllers/index.js

$.index.open();
var node = Alloy.Collections.node;
node.fetch();

进一步阅读:

希望它有用。

答案 1 :(得分:0)

这是您的问题的解决方案: -

    var request = Titanium.Network.createHTTPClient();
    var done=false;
    request.onload = function() {
    try {
    if (this.readyState == 4 &amp;&amp; !done) {
       done=true;
    if(this.status===200){
        var content = JSON.parse(this.responseText);
      }else{
        alert('error code' + this.status);
      }
     }
     } catch (err) {
    Titanium.API.error(err);
    Titanium.UI.createAlertDialog({
        message : err,
        title : &quot;Remote Server Error&quot;
    });
}

};

request.onerror = function(e) {

Ti.API.info(e.error);

};

request.open("POST", "http://test.com");

request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

request.send({ test: 'test'});

如果您没有得到答案,请告诉我。

由于