2016-05-12 144 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是一個很好的工具,我不知道它! –