我有一个简单的Flask后端用于API,并且想要发布一个POST。 我不确定错误是 - 我收到错误消息,但我不确定它是Angular还是Flask问题。我在我的Flask中尝试了request.get_json(),然后得到了
{BadRequest} 400 BadRequest:浏览器(或代理)发送了一个请求 这个服务器无法理解
Angular2调用我的service.ts:
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable} from 'rxjs/Rx';
import { Headers } from '@angular/http';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
@Injectable()
export class NicksService {
private headers = new Headers({'Content-Type': 'application/json'});
nickUrl: string = "http://localhost:5000/nick";
constructor(private http: Http) { }
// Send the nick to the server to see if it is valid
checkNickValidity(nickName: string): Observable<string>{
return this.http.post(this.nickUrl, JSON.stringify({nick: nickName}), {headers: this.headers})
.map(this.extractData)
.catch(this.handleError)
}
Flask后端:
from flask_cors import CORS
from flask.ext.api import FlaskAPI
from flask import request
app = FlaskAPI(__name__)
CORS(app)
@app.route('/')
@app.route('/nick', methods=['POST'])
def check_nick():
try:
nick = request.json
if nick =='AmandaPanda':
return 'Good'
else:
return 'No nick found'
except:
return 'error'
if __name__ == '__main__':
app.run()
答案 0 :(得分:2)
我认为你的申请双方都有问题。
客户端:
Angular的Http's post方法接收body参数中的任何对象,这意味着您不需要对其进行字符串化。
E.g:
this.http.post(this.nickUrl, {nick: nickName}, {headers: this.headers})
服务器端:
一旦客户端的请求正确到达服务器,您就无法正确获取数据。
你需要做的是这样的事情:
from flask import jsonify
(... your code ...)
data = request.json
nick = data.get('nick')
if nick == 'AmandaPanda':
return jsonify({'message': 'good'}), 200
else:
return jsonify({'message': 'no nick found'}), 400
这里,json数据作为字典存储在变量data
中。之后,缺口是从所述词典的nick
键获得的。
最后,以json形式返回客户端是一种更好的做法。这就是Flask's jsonify方法的用途。请注意响应附加的200和400 status codes,以向客户端指示请求是否被正确接受(200)或者是否是错误请求(400)。