困惑:AngularJS $http POST 响应返回索引文件的 HTML 内容

Posted

技术标签:

【中文标题】困惑:AngularJS $http POST 响应返回索引文件的 HTML 内容【英文标题】:Confusion: AngularJS $http POST response is returning HTML content of index file 【发布时间】:2016-08-17 21:11:37 【问题描述】:

我正在使用 AngularJS,它使用 Ruby on Rails API 进行身份验证。我在 AngularJS 中使用 $http 服务使用 POST 请求向后端注册用户,但是,我很困惑,因为我得到的响应总是以 html 形式返回,它是索引页面,而不是来自的实际数据导轨 API。我在本地环境中测试这个,AngularJS 应用程序在 localhost:9000 上运行,Rails API 在 localhost:3000 上。 AngularJS 使用代理将请求定向到端口 3000。

我已经使用 curl 命令测试了 Rails API 的响应:

$ curl -H "Content-Type: application/json" -d '"user":"email":"hi@hi.com","password":"12345678"' -X POST http://localhost:9000/api/users.json

从服务器返回响应为:

"success":true,"info":"Registered","data":"user":"id":5,"created_at":"2016-04-24T14:13:24.289Z","updated_at":"2016-04-24T14:13:24.298Z","email":"hi@hi.com","authentication_token":"-49zyhbCiddYdjssQx6i","auth_token":"-49zyhbCiddYdjssQx6i"

这是前端的代码,位于 AngularJS 控制器中:

 $scope.register = function() 
            $http(
                url: '/api/users',
                method: 'POST',
                data: 
                    user: $scope.user
                
            ).then(
                // success
                function(response) 
                    console.log(response.data);
                    console.log(response.auth_token);
                    tokenHandler.set( response.auth_token );
                    $location.path('/');
                ,
                // error
                function(response) 
                    $scope.user.errors = response;
                );
        ;

这是服务器响应代码:

class Users::RegistrationsController < Devise::RegistrationsController
respond_to :json

def create
build_resource(sign_up_params)

if resource.save
  sign_in resource
  render status: 200,
         json: 
             success: true,
             info: "Registered",
             data: 
                 user: resource,
                 auth_token: current_user.authentication_token
             
         
else
  # Otherwise fail
  render status: :unprocessable_entity,
         json: 
             success: false,
             info: resource.errors,
             data: 
         
end
end
end

但是,当我调用 register 方法时,响应总是在 HTML 和我前端的索引文件中。

我错过了什么吗?

【问题讨论】:

在您的curl 调用中,您的URL 是http://localhost:9000/api/users.json,而在您的$http 调用中,URL 是/api/users 我尝试在 $http 调用中使用localhost:9000/api/users.json,但它的响应相同,索引页面的 HTML。 【参考方案1】:

代理似乎将 localhost:9000 调用定向到服务器,但响应始终是前端索引文件的 HTML 内容。我不确定实际问题是什么,也不确定这种类型的东西。我通过将 $http POST 请求发送到 localhost:3000 而不是 localhost:9000 来解决此问题。

【讨论】:

【参考方案2】:

似乎 Angular 没有发出期望 json 的请求。而且 rails 需要那个明确的(你的 curl 命令明确要求 json 格式)

在您的角度代码中,您可以尝试将 url 从 url: '/api/users' 更改为 url: '/api/users.json'。您还可以检查如何从 Angular 发送预期的 application/json 内容类型。

【讨论】:

【参考方案3】:

不确定我是否理解发生了什么。但是从您的帖子的外观来看,这是我所理解的(我的英语并非完美无缺):

当外部调用时(Angular 应用程序收到请求),该请求被转发到端口 3000(代理)。因此,为什么您会从“curl”调用中得到适当的响应。 当 Angular 应用发出请求时,它不会被转发。因此,为什么要求 /api/users 会为您提供 Angular 应用程序索引(我想有一个故障安全路由来索引或解释该行为的某种原因)。

如果有任何意义,你能测试一下吗?

【讨论】:

以上是关于困惑:AngularJS $http POST 响应返回索引文件的 HTML 内容的主要内容,如果未能解决你的问题,请参考以下文章

Angularjs - 未发布表单发布数据?

AngularJS $http 之 POST 传参

Angularjs $http.post

Angularjs `$http` 发送 POST 而不是 GET

AngularJS $http.POST 方法 405 错误

如何从Angularjs CacheFactory中提取响 应体