Возникли проблемы с сервисом node.save между drupal и appcelerator titanium - PullRequest
0 голосов
/ 01 февраля 2011

Я пишу свое первое приложение, используя 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. Если я подключу свой JSON к странице служб через drupal admin, он создаст узел (не узел 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";
}

Я не получаю отказ в доступе, но он не отправляет ответ обратно в приложение.

Кто-нибудь еще сталкивался с этой проблемой, и если да, то смогли ли вы найти решение для нее?

Ответы [ 3 ]

1 голос
/ 06 июня 2011

В данный момент есть несколько проблем с модифицированным сервером JSON из блога Sumit.Патч был сделан для работы с предыдущей версией сервисов 2. Два дня назад я занимался той же проблемой.Я работал очень отчаянно и, к сожалению, уже не помню, как все развернулось.Одна из проблем заключается в том, что устаревший серверный модуль json приводит к сбою служб.Опять же, я больше не помню деталей, но вот решение, которое я нашел.Это только php 5.2 +, так как он использует json_encode и json_decode.Сначала вытащите последнюю стабильную версию JSON Server.Суть в том, что json_decode должен возвращать ассоциативные массивы вместо объектов php, поскольку именно этого ожидает Drupal.Таким образом, вы вызываете json_decode ($ json_string, TRUE), используя логический ключ, чтобы json_decode возвращал связанные массивыИтак, ниже быстрое и очень грязное решение:

     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"));
}
0 голосов
/ 10 мая 2011

node.get, view.get и system.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 при отказе в доступе.

0 голосов
/ 05 мая 2011

Попробуйте заключить параметры в кавычки; как "node.save"; у меня это сработало.

...