2017-03-21 70 views
1

我使用的是凤凰1.3版在我的应用程序反应,试图让GET请求:凤凰+阵营不能让HTTPGET请求

httpGet('/api/v1/users') 
    .then(function (data) { 
    console.log("http get works!!!!"); 
    }) 
    .catch(function (error) { 
    console.log("nope doesn't work"); 
    }); 

其中HTTPGET是:

export function httpGet(url) { 
    return fetch(url, { 
    headers: buildHeaders(), 
    }) 
    .then(parseJSON); 
} 

parseJSON :

export function parseJSON(response) { 
    return response.json(); 
} 

buildHeaders():

const defaultHeaders = { 
    Accept: 'application/json', 
    'Content-Type': 'application/json', 
}; 
function buildHeaders() { 
    const authToken = localStorage.getItem('phoenixAuthToken'); 
    return { ...defaultHeaders, Authorization: authToken }; 

这是我的路由器:

defmodule App.Web.Router do 
    use App.Web, :router 

pipeline :browser do 
    plug :accepts, ["html", "json"] 
    plug :fetch_session 
    plug :fetch_flash 
    plug :protect_from_forgery 
    plug :put_secure_browser_headers 
end 

pipeline :api do 
    plug :accepts, ["json"] 
    plug Guardian.Plug.VerifyHeader 
    plug Guardian.Plug.LoadResource 
end 

scope "/", App.Web do 
    pipe_through :browser # Use the default browser stack 
    get "/*path", PageController, :index 
end 

scope "/api", App.Web do 
    pipe_through :api 

    scope "/v1" do 
    post "/users", UserController, :create 
    get "/users", UserController, :index 
    end 
end 

我不断收到我的HTTPGET请求失败的错误。所以,我的问题是我的路由器出了什么问题?发布,删除请求的作品。我相信它与路由器有关,但我找不到确切的问题。任何帮助感谢!

编辑:来自服务器的响应,我得到:

[info] GET /api/v1/current_user 
[debug] Processing with App.Web.PageController.index/2 
    Parameters: %{"path" => ["api", "v1", "users"]} 
Pipelines: [:browser] 
[info] Sent 200 in 260µs 

而谷歌开发工具:

​​
+0

请求是否触及您的服务器?有什么记录在服务器日志中?浏览器控制台中是否有错误?您可以查看从Chrome开发工具中的网络标签发送的确切请求。 – Dogbert

+0

嘿@Dogbert,我添加了回复。它返回的一切都是正确的,但响应是HTML类型,我想它应该是JSON在这里? – Ilya

+0

啊,试着把第一个'scope do ... end'移到第二个之下。它看起来像你的通配符路线捕捉所有的东西。 – Dogbert

回答

1

你包罗万象的路线get "/*path"是匹配所有的GET请求,包括发送到/api/v1/users的那些因为它在/api/v1/users路线之前存在。如果将它移动到下面,则所有内容都应按预期工作:

pipeline :browser do 
    ... 
end 

pipeline :api do 
    ... 
end 

scope "/api", App.Web do 
    pipe_through :api 

    scope "/v1" do 
    post "/users", UserController, :create 
    get "/users", UserController, :index 
    end 
end 

scope "/", App.Web do 
    pipe_through :browser # Use the default browser stack 
    get "/*path", PageController, :index 
end 
+0

再次感谢!我不知道这个命令在路由器中很重要。 – Ilya

+1

是的,路由按照声明的顺序被编译到函数子句中,所以就像Elixir中的函数子句一样,使用匹配请求的第一条路由。 – Dogbert