2016-01-17 2 views
1

Я создаю приложение AngularJS, и я использую Slim API. Я использую свой API для получения данных из моей БД.Мой localhost не использует правильный путь

Я тестировал свое приложение, и я заметил что-то. У меня есть приложение в моем локальном хосте, но на сервере, и они используют тот же самый код. Я использую этот код для вызова API мой:

angular.module('appDatabaseCtrl', []) 
.controller('databaseCtrl', ['$scope','$routeParams', '$http', '$log', 
    function($scope, $routeParams, $http, $log){ 
     $scope.testDatabaseItems = function(){ 
      $http.get('/api/items').success(function(data) { 
       $log.info("succes!"); 
       $log.log(data); 
      }) 
      .error(function (data, status){ 
       $log.error("error!"); 
       $log.log(data); 
      }); 
     }; 
     $scope.testDatabaseItemById = function(){ 
      $http.get('/api/items/' + $scope.id).success(function(data) { 
       $log.info("succes!"); 
       $log.log(data); 
      }) 
      .error(function (data, status){ 
       $log.error("error!"); 
       $log.log(data); 
      }); 
     }; 
    } 
]); 

Вот мой файл «index.php» в моем Слим API:

<?php 
use \Psr\Http\Message\ServerRequestInterface as Request; 
use \Psr\Http\Message\ResponseInterface as Response; 

//nécessite Slim 
require 'vendor/autoload.php'; 


//Instancie une app de Slim 
$app = new \Slim\App; 

//Associe type de requête avec fonction et paramêtres 
$app->get('/items', 'getItems'); 
$app->get('/items/{id:\d+}', 'getItemById'); 

//Démarre l'application 
$app->run(); 

// Accès à la base de données 
function DB_Connection() { 
    $dbhost = "localhost"; 
    $dbuser = "kevdug_angularjs"; 
    $dbpass = "*****************"; 
    $dbname = "angularjs"; 
    $dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass); 
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    return $dbh; 
} 

function getItems() { 
    $sql = "select * FROM aj_items"; 
    try { 
     $db = DB_Connection(); 
     $stmt = $db->query($sql); 
     $list = $stmt->fetchAll(PDO::FETCH_OBJ); 
     $db = null; 
     echo json_encode($list); 
    } catch(PDOException $e) { 
     echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    } 
} 

function getItemById(Request $request, Response $response, $args) { 
    $id = $args["id"]; 
    $sql = "select * FROM aj_items WHERE id=".$id; 
    try { 
     $db = DB_Connection(); 
     $stmt = $db->query($sql); 
     $list = $stmt->fetchAll(PDO::FETCH_OBJ); 
     $db = null; 
     echo json_encode($list); 
    } catch(PDOException $e) { 
     echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    } 
} 

?> 

Если я использую функцию «testDatabaseItems» в мое приложение на мой сервер, он отлично работает, но когда я пытаюсь использовать его в моем локальном хосте, я получаю сообщение об ошибке 404:

"NetworkError: 404 Not Found - http://localhost:8080/api/items "

Я знаю, что причина, почему я получаю страницу 404 ошибки просто, что адрес должен быть:

localhost:8080/angularjs/api/items

Что я хочу, так это то, что в моей версии localhost он использует хороший путь, но мне не нужно иметь другой код для моей версии localhost и моей версии сервера.

Другая странная вещь: если я перейду к http://kevdug.webfactional.com/api/items, я получу свой объект json, как я ожидаю, но в моем локальном хосте мне нужно добраться до "(моего локального адреса) /api/index.php/items" , По какой-то причине мне нужно указать файл index.php, и я бы не хотел этого делать.

ответ

1

Что касается конфигурации удаленного сервера и локального сервера, просто используйте простое логическое.

// the uri-base is for both remote and local server the same 
$uri = 'http://localhost:8080/'; 

Ожидается, что uri текущего файла на удаленном сервере будет отличаться от файла-uri на локальном сервере. например, на удаленном сервере это /www/site/class.php, а на локальном сервере - c: /php/class.php, если это не работает, используйте другой отпечаток пальца, специфичный для ПК, или просто поместите файл на удаленный компьютер -сервер и проверьте, существует ли, например, файл.

пример кода

if(strpos(__FILE__, 'c:/php/') === 0) { 

    # is local config 
    $uri .= 'angularjs/api/items'; 
} 
else { 

    # is remote config 
    $uri .= 'api/items'; 
} 
+0

Дело в том, что мне нужно сделать это в моем файла JavaScript, а не в файле PHP. Кроме того, вы отвечаете немного технически для меня, не могли бы вы сделать его более понятным? –

+0

hi Kévin, в вашем javascript-файле это должно быть довольно легко достичь. Здесь вы можете просто прочитать доменное имя с помощью window.location или что-то, чтобы проверить, является ли местоположение localhost (локальным, выбирает локальный url) или не localhost (удаленный, выберите удаленный url). – PeterH

+0

Спасибо, ваша идея настолько проста, но при этом идеальна для моей ситуации, не могу поверить, что я об этом не думал. Я использовал оператор if, чтобы поместить путь к API в var, который я всегда использую каждый раз, когда мне нужно вызывать свой API. Я просто добавляю файл index.php в путь, так как заметил, что если я использую «api/...» insted из «/ api/...», он находит папку api apreat ... Почему это так? –

 Смежные вопросы

  • Нет связанных вопросов^_^