2011-02-01 8 views
0

私はAppcelerator Titaniumを使用して私の最初のアプリケーションを書いています。私が使用した他のすべてのサービスは、JSONサーバー(node.get、view.get、system.connect)を介して作業していますが、私の人生はnode.saveの実用的なソリューションを手に入れることはできません。私は同じボートで人を探してみましたが、実際に何かを見つけることはできませんが、どこでもうまく解決策を見つけることはできません。drupalとappceleratorチタンの間のnode.saveサービスに問題がある

私は出発点として、次のブログ記事使用:私はJSONやXMLRPCの両方を試してみたが、私はJSONやXMLRPCでアクセス拒否と応答がない ​​

を。 drupal adminを使ってサービスページにJSONを接続すると、ノードが作成されます(CCKノードではなく、ストーリーで動作します)が、アプリケーションを経由すると何も得られません。

次はXMLRPCをしようと私の出力です:

Nodeオブジェクト - 送信されている

[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> 

ここでは何ですか私はGです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"; 
} 

私はアクセスが拒否されていませんが、アプリケーションに返信しません。

他の誰もこの問題に遭遇したことがありますか?もしそうでしたら、修正プログラムを見つけることができましたか?

答えて

0

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

0

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"; 
} 

これは、より多くのエラーサーバー側よりもサーバの応答を処理するアプリケーションコードで例外のように見えます。これは、アクセスが拒否された場合にJSON本体を使用せずにサーバーがHTTP 403エラーを返すことによって発生する可能性があります。

1

現在のところ、Sumitのブログから変更されたJSONサーバーにはいくつか問題があります。このパッチは、以前のバージョンのサービス2で動作するように作られました。2日前、私は同じ問題を扱っていました。私は非常に精神的に働いていた、そして、残念なことに、すべてがどのように展開されたかをもう覚えていない。問題の1つは、古くなったjsonサーバーモジュールがサービスをクラッシュさせることです。繰り返しますが、私はもう詳細を覚えていませんが、私が見つけた解決策がここにあります。 json_encodeとjson_decodeを使用するので、PHP 5.2 +のみです。最初に、JSON Serverの最新の安定版を取得します。 主な点は、json_decodeは、Drupalが期待しているように、phpオブジェクトではなく連想配列を返さなければならないということです。したがって、json_decode($ json_string、TRUE)を呼び出すと、booleanスイッチを使用して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")); 
} 
関連する問題