使用JSON

时间:2017-06-09 03:13:13

标签: json angular flask angular2-services

我有一个简单的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()

1 个答案:

答案 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)。