размещение данных JSON с curl и неудачей - PullRequest
0 голосов
/ 04 января 2012

У меня есть эта функция здесь:

public static function call($action, array $args) 
{
  $post_args = array(
                'action'  => $action,
                'args'    => $args
               );
  $stream    = json_encode($post_args);
  $headers   = array(
                 'Content-type: application/json',
                 'Accept: application/json',
                 'Expect:'
               );
  $userpwd   = self::$_user.':'.sha1(sha1(self::$_pass));

  $ch   = curl_init();
  $args = array(
           CURLOPT_URL            => self::$_url,
           CURLOPT_FOLLOWLOCATION => TRUE,
           CURLOPT_RETURNTRANSFER => TRUE,
           CURLOPT_POST           => TRUE,
           CURLOPT_POSTFIELDS     => $stream,
           CURLOPT_HTTPHEADER     => $headers,
           CURLOPT_USERPWD        => $userpwd
          );
  curl_setopt_array($ch, $args);
  $res  = curl_exec($ch);
  $data = json_decode($res, true);
  if (isset($data) === TRUE
      && empty($data) === FALSE
  ) {
    $res = $data;
  }
  return $res;

}//end call()

и по URL, где я пишу, я просто делаю:

echo file_get_contents('php://input');

но ничего не получаю, хотя ясделать данные.В чем может быть проблема?Я в тупике.

Кроме того, зачем мне нужно установить для CURLOPT_FOLLOWLOCATION значение TRUE, когда я просто размещаю URL-адрес простого виртуального хоста на моем локальном компьютере, без перенаправлений.1012 *

попытался переделать его с помощью fopen следующим образом:

public static function call($action, array $args) 
{
  $post_args = array(
                'action'  => $action,
                'args'    => $args
               );
  $stream    = json_encode($post_args);

  $userpwd   = self::$_user.':'.sha1(sha1(self::$_pass));

  $opts = array(
           'http' => array(
                      'method'  => 'POST',
                      'header'  => array(
                                     "Authorization: Basic ".base64_encode($userpwd),
                                     "Content-type: application/json"
                                   ),
                      'content' => $stream
                     )
          );

  $context = stream_context_create($opts);

  $res = '';
  $fp = fopen(self::$_url, 'r', false, $context);
  if($fp){
    while (!feof($fp)){
      $res .= fread($fp, 128);
    }
  }
  return $res;

}//end call()

безуспешно.Соединение работает с curl и fopen, так как я передаю статус вместе с результатом (который является просто входным потоком php: //).Есть идеи?

Ответы [ 2 ]

0 голосов
/ 04 января 2012

Обнаружил проблему.

Я звонил http://localhost/api,, так как думал, что он автоматически загрузит index.php, а затем я собирался изменить имя файла по умолчанию для этой папки.

Проблема заключалась в том, что я не добавил index.php в конце - мне следовало позвонить http://localhost/api/index.php. Таким образом, это работало с cURL и с fopen.

Есть идеи, как вызвать API, не раскрывая имя файла?

0 голосов
/ 04 января 2012

Можете ли вы быть уверены, что функция curl_exec успешно завершится.Кроме того, почему бы вам не использовать fopen для этой цели.Я написал JSON RPC-клиент и сервер.Я отправляю запросы с помощью fopen, и он отлично работает.

        $httpRequestOptions =
            array(
                'http'=>array(
                    'method'=>'POST',
                    'header'=>'Content-type: application/json',
                    'content'=>$requestJSON
                )
            );

        $context = stream_context_create($httpRequestOptions);

        // send request
        if($fileHandler = @fopen($serverURL, 'r', false, $context)){

Остальное я не пишу.Вы можете использовать этот код, который я написал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...