我在尝试从Ruby返回json时遇到问题。
这是我的控制器( parts_controller )。
def show()
@part = Part.find(params[:id])
unless @part.nil?
render json: @part
end
end
我的路由文件:
Rails.application.routes.draw do
root to: "home#index"
resources :parts
end
这是我在Ionic的发帖方法。
postData()
{
let headers = new Headers();
headers.append('Content-Type', 'application/json');
let body = {
id: 1
};
this.http.post('http://localhost:3000/parts/1', JSON.stringify(body), {headers: headers})
.map(res => res.json())
.subscribe(data =>{
console.log(data);
});
}
如果我手动输入http://localhost/3000/parts/1,它将返回JSON,但是当我尝试通过邮寄方式获取它时,它会抛出: POST http://localhost:3000/parts/1 404(未找到)
我也有show和index方法的视图,谢谢您的时间。
答案 0 :(得分:4)
this.http.get('http://localhost:3000/parts/1', {headers: headers})
.map(res => res.json())
.subscribe(data =>{
console.log(data);
});
因为该节目应该具有GET not POST方法。 POST用于将数据发送(POST)到后端,而不是获取数据。
如果您使用耙式路径或铁轨式路径,则会找到正确的路径,以及可以用于每个动作的方法。
答案 1 :(得分:0)
我为我的所有http请求创建了一个父类,
api.service.ts
import {HttpClient, HttpParams} from '@angular/common/http';
import {Injectable} from '@angular/core';
import {ENV} from '@app/env';
import {Observable} from "rxjs/Observable";
@Injectable()
export class Api {
constructor(public http: HttpClient) {}
post(endpoint: string, body: any) {
return this.http.post(ENV.SERVER_URL + '/' + endpoint, body);
}
}
我写了一个班级,可以在每次请求之前就上班
http.token.interceptor.ts
export class TokenInterceptor implements HttpInterceptor {
constructor(public auth: AuthService) {}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
request = request.clone({
setHeaders: {
Accept: 'application/xxx.v1+json',
Authorization: "bearer " + this.auth.getToken()
}
});
return next.handle(request);
}
}
因此添加的标头以及每个请求都将到达服务器。
part.service.ts
...
constructor(public api: Api) {}
getParts(): Observable<Part[]>{
return this.api.get("parts")
.map(res => {
if(res) {
return res.map(item => {
return new Part(item);
});
}
});
}
...
我们现在就可以使用该服务进行订阅
任何服务或组件
this.partService.getParts().subscribe(parts => {
..
});
},(error: Response) => {
return Observable.throw(error)
});
您需要在服务器端进行机架验证
Gemfile.rb
gem 'rack-cors'
并且您必须添加到...
application.rb
config.middleware.insert_before 0, Rack::Cors do
allow do
origins '*'
resource '*', headers: :any, methods: %i[get post options patch delete]
end
end