代码之家  ›  专栏  ›  技术社区  ›  timaxs com

如何在python中获得这种响应,就像在bash中一样?

  •  0
  • timaxs com  · 技术社区  · 2 年前

    如何在python代码中传输这个bash-curl。

    我想要在python中重制版的一段代码:

    response=$(curl -i -H "Content-Type: application/json" "https://api.selvpc.ru/identity/v3/auth/tokens" -d " { \"auth\": { \"identity\": { \"methods\": [\"password\"], \"password\": { \"user\": { \"name\": \"$USER_NAME\", \"domain\": { \"name\": \"$ID_SELECTEL\" }, \"password\": \"$PASSWORD\" } } }, \"scope\": { \"project\": { \"name\": \"$PROJECT_NAME\", \"domain\": { \"name\": \"$ID_SELECTEL\" } } } } }")

    我做了什么:

    HEADERS = { \
        "Content-type": "application/json"}
    
    PARAMETRES={\
            "auth":{\
                "identity":{\
                    "methods":["password"], \
                    "password":{\
                        "user":{\
                            "name" : USER_NAME, \
                            "domain" : {\
                                "name":ID_SELECTEL
                            }, \
                            "password":PASSWORD
                        }
                    }
                },\
    
                "scope":{\
                    "project":{\
                        "name":PROJECT_NAME, \
                        "domain":{\
                            "name":ID_SELECTEL \
                        }
                    }
                }
            }
    }
    response = requests.get(DATA_URL, params=PARAMETRES, headers=HEADERS)
    print(response)
    

    输出: <Response [401]>

    我想我可能丢了一些字典,这是一个错误。

    (很抱歉我英语不好)

    2 回复  |  直到 2 年前
        1
  •  0
  •   MakarovDs    2 年前

    您的问题很可能与POST请求有关。最初的bash脚本使用curl-d,这表示POST请求,而不是GET。

    此外,您还可以将参数作为params传递,从而将它们添加到URL中。相反,您应该使用json或data关键字(取决于服务器期望的类型-json或常规数据)在请求体中传递它们。

    您重写的代码可能如下所示:

    import requests
    import json
    HEADERS = {
        "Content-Type": "application/json"
    }
    
    PARAMETERS = {
        "auth": {
            "identity": {
                "methods": ["password"],
                "password": {
                    "user": {
                        "name" : USER_NAME,
                            "domain" : {
                            "name": ID_SELECTEL
                        },
                        "password": PASSWORD
                    }
                }
            },
            "scope": {
                "project": {
                    "name": PROJECT_NAME,
                    "domain": {
                        "name": ID_SELECTEL
                    }
                }
            }
        }
    }
    
    response = requests.post('https://api.selvpc.ru/identity/v3/auth/tokens', 
                             headers=HEADERS, 
                             data=json.dumps(PARAMETERS))
    print(response)
    

    请注意,请求的URL现在包含在requests.post参数中,而不是作为DATA_URL变量。JSON中编码的参数使用data关键字进行传输。

    在使用API时,处理响应状态代码是常见的做法。如果您收到401,则表明存在身份验证问题——您的用户名或密码可能不正确,或者服务器可能需要您未提供的额外身份验证。

        2
  •  0
  •   Greenylie    2 年前

    cURL正在发出HTTPPOST请求,但是,您正在Python上发出GET请求。

    只需编辑请求即可。访问 requests.post(DATA_URL, json=PARAMETERS, headers=HEADERS)

    推荐文章