为什么我的API请求在每个POST参数上返回空值?
问题描述:
在本地主机上,我已经下载了Flask-Cors。我尝试向烧瓶服务器发送少量请求,因为整个代码下方的代码位于github上。为什么我的API请求在每个POST参数上返回空值?
不幸的是我无法使用POST请求获取任何数据。
这是我的ELM代码。
module Update exposing (update)
import Http
import Json.Decode exposing (..)
import Types exposing (..)
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of Username str -> ({ model | loginUserName = str}, Cmd.none)
Password str -> ({ model | loginPassword = str}, Cmd.none)
Login -> (model, login model.loginUserName model.loginPassword)
LoginResult (Ok username) -> ({ model | user = LoggedInUser { userName = username}},
Cmd.none)
LoginResult (Err _) -> (model, Cmd.none)
Logout -> (model, Cmd.none)
login : String -> String -> Cmd Msg
login username password =
let url = "http://0.0.0.0:8080/api/user/login"
request = Http.get url decodeLogin
in Http.send LoginResult request
decodeLogin: Decoder String
decodeLogin = at ["username"] string
-- Or
--decodeLogin : Decoder String
--decodeLogin = decodeString (field "username" string)
代码的其余部分是在Github
这里是我的API
@app.route("/api/user/login/", methods=["GET", "POST"])
def login(*args, **kwargs):
print 'Got request for login'
print args
print kwargs
print request.args
print request.args.get("username")
print request.values.get("username")
print request.method
print request.form['username']
response = {'username': 'Erik'}
dict = request.args
for key in dict:
print 'form key ' + dict[key]
return jsonify(response)
这个代码的其余部分也at this link
瓶端点。
答
看起来您的服务器期望POST主体采用多个key=val
格式,而不是JSON格式。您可以使用multipartBody
来实现这一目标:
import Http exposing (..)
login : String -> String -> Cmd Msg
login username password =
let url = "http://0.0.0.0:8080/api/user/login"
body =
multipartBody
[ stringPart "username" username
, stringPart "password" password
]
request = Http.post url body decodeLogin
in Http.send LoginResult request
答
我只想补充一点,虽然你可以在IP地址0.0.0.0
直接的请求,这是不是你的瓶的应用正在监听的地址。 0.0.0.0
表示烧瓶应用程序正在监听所有可用的IP地址(因为它是为此目的而保留的,所以不包括0.0.0.0
)。您可以通过127.0.0.1
和localhost
联系您的烧瓶应用程序。