Запросы Post / Put в python всегда возвращают 415 - PullRequest
0 голосов
/ 28 января 2020

Я создал несколько методов, чтобы сделать запрос к Swagger's Pet Shot API просто так:

api.py

def request(method, url, json=None, **kwargs):
    with requests.sessions.Session() as session:
        return session.request(method=method, url=url, json=json, **kwargs)

def post(url, data=None, **kwargs):
    response = requests.post(url, data)
    print(response.status_code)
    return request('post', url, data=data, **kwargs)

def put(url, data=None, **kwargs):
    response = requests.post(url, data)
    print(response.status_code)
    kwargs.setdefault('allow_redirects', True)
    return request('put', url, data=data, **kwargs)

И затем я вызываю эти методы в другом классе, например:

data.py

# Post
payload = {"name": "MahDawg", "photoUrls": ["VeryPretty.jpeg"]}
print(payload)
PostData = api.post(url=variables.base_url + variables.pet_url, data=payload, headers=variables.headers)


# Put
payload = {"id": "9216678377732892246", "name": "MahDawg", "photoUrls": ["VeryPretty.jpeg"]}
json_data = json.dumps(payload)
print(payload)
PutData = api.put(url=variables.base_url + variables.pet_url, headers=variables.headers, data=payload)

Использование их в файле переменной, чтобы не использовать жесткий код информация

base_url = "https://petstore.swagger.io/v2"
pet_url = "/pet/"
headers = {"Content-type": "application/json", "Accept": "application/json"}

И я постоянно получаю эту ошибку

{'name': 'MahDawg', 'photoUrls': ['VeryPretty.jpeg']}
https://petstore.swagger.io/v2/pet/
Traceback (most recent call last):
  File "data.py", line 12, in <module>
    PostData = api.post(url=variables.base_url + variables.pet_url, data=payload, headers=variables.headers)
  File "C:\Users\fjgomescaramelo\PycharmProjects\apitestautomationsample\api.py", line 21, in post
    print(response.json())
  File "C:\Python27\lib\site-packages\requests\models.py", line 889, in json
    self.content.decode(encoding), **kwargs
  File "C:\Python27\lib\json\__init__.py", line 339, in loads
    return _default_decoder.decode(s)
  File "C:\Python27\lib\json\decoder.py", line 364, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Python27\lib\json\decoder.py", line 382, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

C:\Users\fjgomescaramelo\PycharmProjects\apitestautomationsample>python data.py
{'name': 'MahDawg', 'photoUrls': ['VeryPretty.jpeg']}
https://petstore.swagger.io/v2/pet/
Traceback (most recent call last):
  File "data.py", line 12, in <module>
    PostData = api.post(url=variables.base_url + variables.pet_url, data=payload, headers=variables.headers)
  File "C:\Users\fjgomescaramelo\PycharmProjects\apitestautomationsample\api.py", line 21, in post
    print(response.json())
  File "C:\Python27\lib\site-packages\requests\models.py", line 889, in json
    self.content.decode(encoding), **kwargs
  File "C:\Python27\lib\json\__init__.py", line 339, in loads
    return _default_decoder.decode(s)
  File "C:\Python27\lib\json\decoder.py", line 364, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Python27\lib\json\decoder.py", line 382, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

Первая строка в журнале - это просто подтверждение того, что полезная нагрузка json правильная, я также проверил ее и это работает в запросе Почтальона, но не в python. Я всегда возвращаюсь, что объект не может быть декодирован.

Я пробовал обходные пути безрезультатно. Методы получения и удаления работают без проблем.

Заранее спасибо.

РЕДАКТИРОВАТЬ: Для ручной проверки запросов я использую Почтальон, и я экспериментировал с тем же POST запрос без заголовка Content-type, и он возвращает мне код 415 и с заголовком он успешно выполняет POST. Я пытаюсь включить все заголовки, которые использует Postman, и все еще получаю ту же ошибку

...