2011-02-01 1 views
0

Appcelerator Titanium을 사용하여 첫 번째 앱을 쓰고 있는데 나는 흔들릴 수있는 장애물을 쳤습니다. 내가 사용한 모든 다른 서비스는 JSON 서버 (node.get, view.get, system.connect)를 통해 작동하지만 나에게있어서 node.save의 작업 솔루션을 얻을 수는 없다. 나는 같은 보트에서 사람들을 검색해 보았지만 아무 것도 찾을 수 없었지만 어디서나 해결책을 찾을 수 없었습니다. drupal과 appcelerator titanium 사이에 node.save 서비스에 문제가 있음

나는 출발점으로 다음 블로그 게시물 사용 : 내가 JSON과 XMLRPC 모두를 시도했습니다 http://civicactions.com/blog/2010/may/02/tutorial_code_developing_apps_iphoneipadandroid_using_drupal_base_system

을하지만 JSON과 XMLRPC에 액세스가 거부 아무런 응답을하지 않습니다. 드루팔 (drupal) 관리자를 통해 JSON을 서비스 페이지에 연결하면 노드 (CCK 노드가 아니라 스토리로 작업 한 노드)가 생성되지만 앱을 통해 아무것도 얻지 못한다.

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

은 무엇입니까

노드 객체 :

다음

은 XMLRPC으로 시도 내 출력 나는 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

따옴표 사이에 매개 변수를 배치하십시오. like "node.save"; 그것은 나를 위해 일했다.

0

node.get, view.getsystem.connectnode.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 일 전에 나는 같은 문제를 다루었습니다. 나는 아주 광란 적으로 일하고 있었고 불행하게도 모든 것이 어떻게 전개되었는지 더 이상 기억하지 않는다. 문제 중 하나는 오래된 json 서버 모듈이 서비스를 중단시키는 것입니다. 다시, 나는 세부 사항을 더 이상 기억하지 않지만, 여기에 내가 찾은 해결책이있다. 그것은 json_encode와 json_decode를 사용하기 때문에 PHP 5.2 + 전용입니다. 먼저 JSON Server의 최신 안정 버전을 가져옵니다. 요점은 json_decode가 Drupal이 기대하는 것처럼 PHP 객체 대신 연관 배열을 반환해야한다는 것입니다.따라서 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")); 
}