【问题标题】:HTTP GET request to API - localhost vs server. The request gets "duplicated/transformed" on the server对 API 的 HTTP GET 请求 - 本地主机与服务器。请求在服务器上被“复制/转换”
【发布时间】:2016-01-18 12:59:01
【问题描述】:

我正在使用 Angular(正面)和 Slim(背面)。

当我在本地发出请求时,它工作正常并返回 JSON。

http://localhost/domain/api/jobs

但是当我在我的服务器上发出相同的请求时:

http://xxx.xxx.xxx.xxx/~username/domain/api/jobs

我得到一个 404。经过检查,我看到发送的请求实际上转换为:

http://xxx.xxx.xxx.xxx/~username/~username/domain/api/jobs

我无法提出请求,因为它会自动更改。为什么会这样?

代码如下:

Angular app/service.factory.js

angular
    .module('app')
    .factory('jobService', jobService);

function jobService($http) {

    var baseUrl = 'api/';

    return {
        getJobs: getJobs,
    };

    function getJobs() {
        return $http.get(baseUrl + 'jobs');
    }
};

Angular app/jobs.config.js

angular
    .module('app')
    .config(config);

function config($routeProvider) {
    $routeProvider.when('/', {
        templateUrl: 'templates/jobs-view.html',
        controller: JobController,
        controllerAs: 'jobCtrl'
    });
};

function JobController(jobService) {
    var that = this;

    jobService.getJobs().success(function (data) {
        that.jobs = data;
    });
};

Slim PHP api/index.php

require 'vendor/autoload.php';

$app = new \Slim\App; 

$app->get('/jobs', 'getJobs');

$app->run();

function getJobs() {
    $sql = "select * FROM jobs ORDER BY id";
    try {
        $db = getConnection();
        $stmt = $db->query($sql);  
        $jobs = $stmt->fetchAll(PDO::FETCH_OBJ);
        $db = null;
        echo json_encode($jobs);
    } catch(PDOException $e) {
        echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    }
}

【问题讨论】:

  • 可以定义一个常量 app.constant('BASE_API_URL', 'xxx.xxx.xxx.xxx/~username/domain/api/') 并将其注入到您进行 api 调用的位置。像 app.service('jobService', function (BASE_API_URL) {});然后,$http.get(BASE_API_URL + 'jobs') 向jobs api发出请求?
  • @Ivan - 你必须在某个地方为你的 $http 请求设置一个基本 URL,对吧?似乎需要查看您的 Slim 路由,它正在解释 'api/jobs' 并将其设置为在您的服务器上与本地时相对于不同的基本 URL。我不知道 Slim,否则我可能有更具体的观点。
  • 我想不出转换 URL 的任何原因。如果我能调试应用程序本身就好了。
  • 我认为 Prashant 关于注入 URL 的评论是您应该做的。这就是我设置对任何 API 的 Angular 调用的方式……我不使用相对路径。这样做的时候你的假设太多了。

标签: angularjs http get slim


【解决方案1】:

我认为您必须尝试使用​​完整的 url 而不是相对路径。我认为这将解决问题。所以使用 http://domain.com/restful/api/commands 而不是 restful/api/commands 。

【讨论】:

  • 好的,但是当我尝试通过粘贴 http://xxx.xxx.xxx.xxx/~username/domain/api/jobs 直接在浏览器中调用 API 时,从技术上绕过 Angular 路由,我应该得到 JSON ......但无论如何它都会重复,导致404。
【解决方案2】:

如果你在你的 api/index.php 中尝试这个来代替当前的 $app->get:

$app->get('/~username/domain/api/jobs', 'getJobs');

尝试一下,看看结果是什么,好奇这是否可能是其中的一部分。至少在我所指的上下文中,关于使用完整 URL 与相对 URL 的讨论是从 API 的角度来看的。

【讨论】:

  • 我尝试了一些东西,但我真的很困惑。我在域下添加了应用程序,它可以工作。前任。 domain.com/api/jobs 有效,而 http://xxx.xxx.xxx.xxx/~username/domain/api/jobs 不... 什么给出?我联系了技术支持,那个人告诉我这是因为 PHP 版本... WTF?
  • 他有说为什么吗?您的 PHP 版本在做什么与最新版本在做什么?我仍然相信这是该版本解释相对路径的方式。您是否尝试过上述换行,是否给出了不同的结果?您是否能够使用您所说的作为最终修复的域解决方案?在这种情况下,域绕过 PHP 完成的路径,直接将您带到位置 + '/api/jobs'。如果没有域,它会告诉您“/api/jobs”的隐含路径,到目前为止这是不正确的。
  • 嘿,我尝试了你的建议。它不起作用。除了使用域与 IP/~username/... 我真的不想无休止地研究这个,所以我只是坚持使用域。 :) 感谢您的宝贵时间。
  • 当然,我很高兴您至少可以使用该域来工作。祝你好运!
  • 当我需要使用 /~username/ 时,我总是使用子域。因此,对于开发事物,我有一个域,并且只使用子域。使用 /~username/ 来测试网站对我来说从来没有什么好处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 2019-03-12
  • 2017-01-28
  • 1970-01-01
  • 2017-02-25
相关资源
最近更新 更多