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 の以前のバージョンで動作するように作成されました。2 日前、私は同じ問題に対処していました。私は必死に仕事をしていましたが、残念なことに、すべてがどのように展開されたかはもう覚えていません。問題の 1 つは、古い json サーバー モジュールがサービスをクラッシュさせることです。繰り返しますが、詳細はもう覚えていませんが、ここに私が見つけた解決策があります。json_encode と json_decode を使用するため、php 5.2 + のみです。最初に、JSON サーバーの最新の安定バージョンをプルします。主なポイントは、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"));
}
于 2011-06-05T23:31:49.900 に答える
0

node.getview.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";
}

これは、サーバー側のエラーというよりも、サーバーの応答を処理するアプリケーション コードの例外のように見えます。これは、アクセスが拒否されたときにサーバーが JSON 本文なしで HTTP 403 エラーを返すことが原因である可能性があります。

于 2011-05-10T11:56:20.513 に答える
0

パラメータを引用符で囲んでみてください。「node.save」のように。それは私のために働いた。

于 2011-05-05T14:14:52.240 に答える