0

我正在使用 Appcelerator Titanium 编写我的第一个应用程序,但遇到了一个我似乎会动摇的障碍。我使用的所有其他服务都通过 JSON 服务器(node.get、view.get、system.connect)工作,但我无法终生获得 node.save 的工作解决方案。我曾尝试在同一条船上寻找人,但实际上找不到任何东西,但我也无法在任何地方找到可行的解决方案。

我使用以下博客文章作为起点: http ://civicactions.com/blog/2010/may/02/tutorial_code_developing_apps_iphoneipadandroid_using_drupal_base_system

我已经尝试过 JSON 和 XMLRPC,但我没有得到 JSON 响应和 XMLRPC 拒绝访问。如果我通过drupal admin将我的JSON插入服务页面,它将创建一个节点(不是CCK节点,但它与故事一起使用)但通过应用程序我什么也得不到。

以下是我尝试使用 XMLRPC 的输出:

节点对象 -

[INFO] {
sessid = b03429453c85d4bf3d600dff6511f70f;
title = "This is a new node.";
type = story;
}



[INFO] xmlrpc: begin
[INFO] xmlrpc: url: http://mysite/services/xmlrpc
[INFO] xmlrpc: method: node.save
[INFO] xmlrpc: p: story
[INFO] xmlrpc: p: This is a new node.
[INFO] xmlrpc: p: b03429453c85d4bf3d600dff6511f70f

正在发送的 XML -

[INFO] xmlrpc: xml: <methodCall><methodName>node.save</methodName><params><param><string>story</string></param><param><string>This is a new node.</string></param><param><string>b03429453c85d4bf3d600dff6511f70f</string></param></params></methodCall>
[INFO] xmlrpc: end

回复 -

[INFO] Received: <?xml version="1.0"?>
<methodResponse>
<fault>
<value>
<struct>
<member>
<name>faultCode</name>
<value><int>401</int></value>
</member>
<member>
<name>faultString</name>
<value><string>Access denied</string></value>
</member>
</struct>
</value>
</fault>
</methodResponse>

这是我用 JSON 得到的:

[INFO] {"method":"node.save","type":"story","title":"This is a new node.","sessid":"b03429453c85d4bf3d600dff6511f70f"}
[INFO] node.save response: undefined
[WARN] Exception in event callback. {
line = 90;
message = "Unable to parse JSON string";
name = SyntaxError;
sourceId = 204738256;
sourceURL = "file://localhost/Users/justin/Sites/Apps/appname/Resources/add.js";
}

我没有拒绝访问,但它没有将响应发送回应用程序。

有没有其他人遇到过这个问题,如果有,你能找到解决办法吗?

4

3 回答 3

1

Sumit 博客中修改后的 JSON 服务器目前存在一些问题。该补丁适用于以前版本的服务 2。两天前,我正在处理同样的问题。我非常疯狂地工作,不幸的是,我已经不记得一切是如何展开的了。问题之一是过时的 json 服务器模块使服务崩溃。同样,我不记得细节了,但这是我找到的解决方案。它是 php 5.2 + only,因为它使用 json_encode 和 json_decode。首先拉取最新稳定版的 JSON Server。要点是 json_decode 应该返回关联数组而不是 php 对象,这正是 Drupal 所期望的。因此,您调用 json_decode($json_string,TRUE),使用布尔开关使 json_decode 返回 assoc 数组。

     function json_server_server() {
    $_POST = json_decode($_POST['data'],true);
    $_POST = (array)$_POST;
    if (!isset($_POST)) {
      return drupal_to_js(array('error' => TRUE, 'data' => "JSON server accepts POST     requests only."));
    }

  $methods = services_get_all();
  services_strip_hashes($methods);
  $request = $_POST['method'];
  $args = array();


  foreach ($methods as $method) {
    if ($method['method'] == $request) {
      unset($_POST['q']);
      unset($_POST['method']);
      $args = array();
      foreach($method['args'] as $arg) {
        if(isset($_POST[$arg['name']])) {
          $args[] = $_POST[$arg['name']];
        }
        elseif($arg['optional'] == 0) {
          return drupal_to_js(array("error" => TRUE, "data" => "Argument ". $arg['name']   ." not recieved"));
        }
        else {
          $args[$arg['name']] = NULL;
        }
      }
      $result = services_method_call($method['method'], $args);

      if (is_array($result) && $result['error'] === TRUE) return  drupal_to_js(array('error' => TRUE, 'data' => $result['message']));

      return(json_encode($result)); //json encode the result, not including the error
    }
  }

  return drupal_to_js(array('error' => TRUE, 'data' => "Invalid  method $request"));
}
于 2011-06-05T23:31:49.900 回答
0

node.get,view.getsystem.connect使用与 不同的权限node.save。他们很可能都被授权给匿名用户,而node.save没有。既然你提到system.connect了,我猜你已经尝试在调用之前启动一个经过身份验证的会话node.save。您确定在通话之间正确维护会话吗?

还,

Exception in event callback. {
  line = 90;
  message = "Unable to parse JSON string";
  name = SyntaxError;
  sourceId = 204738256;
  sourceURL = "file://localhost/Users/justin/Sites/Apps/appname/Resources/add.js";
}

这看起来更像是处理服务器响应的应用程序代码中的异常,而不是服务器端的错误。这很可能是由于服务器在访问被拒绝时返回 HTTP 403 错误而没有 JSON 正文引起的。

于 2011-05-10T11:56:20.513 回答
0

尝试将参数括在引号之间;像“node.save”;它对我有用。

于 2011-05-05T14:14:52.240 回答