2016-05-12 148 views
0

我使用下面的代码,以便在API端点注册用户:Python的请求400错误使用JSON

import argparse 
import requests 
import ConfigParser 
import json 
import sys 
import logging 
#from collections import OrderedDict 
#from cs-check-user.py import get 

# Configuration Parameters 
env = 'Pre_internal' 

Config = ConfigParser.ConfigParser() 
Config.read("../etc/config.ini") 
endpoint = Config.get(env, 'endpoint') 
admin_user = Config.get(env, 'admin_user') 
admin_password = Config.get(env, 'admin_password') 

# Logging Config 
logging.basicConfig(level=logging.INFO, 
        format='%(asctime)s %(levelname)s %(name)s %(message)s', 
        filename='../logs/create_user.log') 

# Functions 
def post(login, email, password): 
     login_ok = login.lower() 

    #data = OrderedDict([('login',login_ok), 
    #      ('email', email), 
    #      ('password', password)]) 
    #data_ok = json.dumps(data, sort_keys=False) 
    #data = '{"login": login, "email": email, "password": password}' 
    #create_user = requests.post(endpoint, data, auth=(admin_user, admin_password)) 

     data = {"login": login_ok, "email": email, "password": password} 
     headers = {'Content-Type': 'application/json'} 
     create_user = requests.post(endpoint, data=json.dumps(data), headers=headers, auth=(admin_user, admin_password)) 

    if create_user.status_code == 202: 
     print 'User has been created successfully' 
     logging.info('User has been created successfully %s', login_ok) 
     sys.exit(0) 

    else: 
     print 'Error Received: ', create_user 
     logging.error('Received error when creating the user %s %s', login_ok, create_user) 
     sys.exit(1) 

# Main 
parser = argparse.ArgumentParser(description='''Script to create users in Cloud Storage''', epilog='''Example: ./cs-create-user.py -l dsmc -e [email protected] -p changeme''') 

parser.add_argument('-l', '--login', help='Login account') 
parser.add_argument('-e', '--email', help='Email account') 
parser.add_argument('-p', '--password', help='Password account') 
args = parser.parse_args() 

if not args.login: 
     print 'Login incomplete' 
if not args.password: 
     print 'Password incomplete' 
if not args.email: 
     print 'Email incomplete' 
else: 
    # Check user 
    #try: 
    # get(args.login) 
    #except SystemExit as exc: 
    # if exc.code == 0: 
    #  print 'The user already exists, please select another login.' 
    #  sys.exit(1) 
    # else: 
      post(args.login, args.password, args.email) 
    # 
    # post(args.login, args.password, args.email) 
sys.exit(0) 

后三小时,我不知道为什么我收到400所有的时间!我认为这个问题与json格式有关,但是为什么?

请帮帮我。

非常感谢您提前。

+0

什么是端点?它是否有我们可以查看的API文档? –

+0

对不起,但是我没有文档的私人终端。我使用以下curl来创建用户以避免python: --- curl -v -u aa:bb -X POST http:// ip:port/api/customer/-H“Accept:application/json; version = 0“-H”Content-Type:application/json“-d”{“login”:“login”,“password”:“ejemplo”,“email”:“[email protected]”}' –

回答

0

我在https://httpbin.org/的帮助下对此进行了调试。首先,我复制你的curl命令发送有:

curl -v -u aa:bb -X POST httpbin.org/post -H "Accept: application/json; version=0" -H "Content-Type:application/json" -d '{"login": "username", "password": "secret", "email":"my_email"}' 

,它返回:

{ 
    "args": {}, 
    "data": "{\"login\": \"username\", \"password\": \"secret\", \"email\":\"my_email\"}", 
    "files": {}, 
    "form": {}, 
    "headers": { 
    "Accept": "application/json; version=0", 
    "Authorization": "Basic YWE6YmI=", 
    "Content-Length": "63", 
    "Content-Type": "application/json", 
    "Host": "httpbin.org", 
    "User-Agent": "curl/7.43.0" 
    }, 
    "json": { 
    "email": "my_email", 
    "login": "username", 
    "password": "secret" 
    }, 
    "origin": "197.155.4.24", 
    "url": "http://httpbin.org/post" 
} 

然后我修改您的代码发送到同一个地方相当于要求,通过argparse传递参数之后。答案看起来很相似。我比较了两种与PyCharm的功能“剪贴板比较”(尽管任何差异的工具会做),问题变得清晰:

The difference

你周围的密码和电子邮件在你的代码交换!我很抱歉。

+0

,在你的代码中你不使用变量,我认为我的问题是相关的变量和JSON,请你能写一个例子吗?非常感谢你。 –

+0

@JoséLuis我发布的唯一'代码'是curl命令。其余的是数据。我在说你的代码可能很好,但是你混淆了密码和电子邮件的参数,即你有'post(args.login,args.password,args.email)'而且'def post(登录,电子邮件,密码)'。这篇文章的其余部分仅仅是说明我是如何计算出来的,因为我认为这个技术很有趣,值得了解。 –

+0

@亚历克斯,非常感谢,是的,现在!!!!!!是一个愚蠢的问题,我没有看到! Httpbin是一个很好的工具,我不知道它! –