2013-08-26 3 views
0

Я создаю Restful WebService с CakePHP 2, однако, я получаю 500 Internal Server Error, так как я не могу захватить Post Data. Остальные сервера, как показано ниже:Restful API для CakePHP 2

App::import ('Vendor', 'ExchangeFunctions', array ('file'=> 'exchange/exchangefunctions.php')); 

class ExchangeController extends AppController 
{ 
    public $components = array('RequestHandler'); 
    public 
    function index() 
    { 
     $exchange = new ExchangeFunctions(); 
     $data = $this->request->data('json_decode'); 
     $exchange->username = $_POST['username']; 
     $exchange->password = $_POST['password']; 
     $emailList = $exchange->listEmails(); 
     $response = new stdClass(); 
     $response->emailList = $emailList; 
     foreach($emailList->messages as $listid => $email) 
     { 
      $tempEmail = $exchange->getEmailContent(
       $email->Id, 
       $email->ChangeKey, 
       TRUE, 
       $_POST['attachmentPath'] 
      ); 
      $response->emails[$tempEmail['attachmentCode']] = $tempEmail; 
     } 
     $this->set('response', $response); 
     $this->set('_serialize','response'); 
    } 
} 

и клиент идет как:

class ApitestController extends AppController 
{ 
    Public function index() 
    { 
     $this->layout = 'ajax'; 
     $jRequestURLPrefix = 'http://localhost/EWSApi/'; 
     $postUrl   = $jRequestURLPrefix."exchange/index.json"; 

     $postData   = array(
      'username'  => 'username', 
      'password'  => 'password', 
      'attachmentPath'=> $_SERVER['DOCUMENT_ROOT'] . $this->base . DIRECTORY_SEPARATOR . 'emailDownloads' . DIRECTORY_SEPARATOR . 'attachments' 
     ); 
     $postData = json_encode($postData); 

     pr($postData); 
     $ch  = curl_init($postUrl); 
     $options = array(
      CURLOPT_RETURNTRANSFER=> true, 
      CURLOPT_HTTPHEADER   => array(
       'Content-Type: application/json', 
       'Content-Length: ' . strlen($postData) 
      ), 
      CURLOPT_CUSTOMREQUEST => 'GET', 
      CURLOPT_POSTFIELDS  => $postData, 
     ); 
     curl_setopt_array($ch, $options); 
     $jsonString = curl_exec($ch); 
     curl_close($ch); 
     $data  = json_decode($jsonString, FALSE); 

     echo $jsonString; 
    } 

} 

Не уверен, где я Мессинг! Пожалуйста помоги!

+1

«_... я получаю 500 Внутренняя ошибка сервера, так как я не могу захватить Post Data_ «Вы должны объяснить немного более подробно, где точно/что именно происходит. Единственная очевидная вещь, связанная с проблемами данных «POST», которые я вижу, заключается в том, что ваш запрос CURL использует 'GET' вместо' POST': 'CURLOPT_CUSTOMREQUEST => 'GET'' – ndm

+0

Извините за отсутствие ясности! переменная post $ _POST ['username'] возвращается. Я попытался изменить CURLOPT_CUSTOMREQUEST => «GET» на «POST», но не повезло! Здесь я хочу сказать, что от клиента, в то время как i POST - имя пользователя, которое не доходит до остального сервера, то есть сервер остальной части не читает $ _POST – Guns

ответ

2

Хорошо, после второго взгляда есть еще несколько подозрительных вещей. Как уже упоминалось, ваш запрос CURL использует GET вместо POST.

$options = array(
    ... 
    CURLOPT_CUSTOMREQUEST => 'POST', 
    CURLOPT_POSTFIELDS  => $postData, 
); 

Другое дело, что вы кодирования данных POST для вашего CURL вызова JSON, но вы пытаетесь получить доступ к нему с другой стороны, используя $_POST, однако там не будет ничего, POST данные будут должна быть строка запроса ключа/значения, форматированная для отображения в $_POST. Вы должны прочитать php://input вместо этого, что может быть то, что вы пытаетесь сделать с

$data = $this->request->data('json_decode'); 

Однако вы должны использовать CakeRequest::input() для этой цели, и, конечно, вы должны затем использовать $data переменную вместо $_POST

$data = $this->request->input('json_decode'); 
$exchange->username = $data['username']; 
$exchange->password = $data['password']; 

.... 

$tempEmail = $exchange->getEmailContent(
    $email->Id, 
    $email->ChangeKey, 
    TRUE, 
    $data['attachmentPath'] 
); 

сделать также двойной уверен, что ваш CURL запрос выглядит как ожидалось:

$options = array(
    ... 
    CURLOPT_POSTFIELDS => $postData, 
    CURLINFO_HEADER_OUT => true // supported as of PHP 5.1.3 
); 
curl_setopt_array($ch, $options); 
$result = curl_exec($ch); 
$info = curl_getinfo($ch); 
curl_close($ch); 

echo '<pre>'; 
print_r($info); 
echo '</pre>'; 
Смежные вопросы