Невозможно отправлять пост-запросы API, используя файл json - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь сделать пост-запрос на сервере api, используя запросы python 3.7, выполнив следующие шаги:

  1. загрузите файл json
  2. вызовите request.post метод и предоставьте параметр данных с загруженнымJSON файл.

Используя этот подход, я получаю ответ от сервера «требуется запрос отсутствует».

Однако, когда я делаю то же самое с Postman, он работает гладко.Я также попытался извлечь код Python из postman, но дает тот же ответ, т.е. отсутствует требуемый запрос .Такое поведение удивительно, что почтальон работает нормально, но когда я пытаюсь повторить то же самое на python, я получаю эту ошибку.

Ошибка

{"error":"Internal Server Error","exception":"org.springframework.http.converter.HttpMessageNotReadableException","message":"Required request body is missing: public void com.netflix.spinnaker.gate.controllers.PipelineController.savePipeline(java.util.Map)","status":500,"timestamp":1543854206771}

request_post.py

import requests
url = "http://spinnaker-api.example.com/pipelines"
headers = {'Authorization': 'Bearer token','Accept' : 'application/json', 'Content-Type' : 'application/json'}
r = requests.post(url, data=open('example.json', 'rb'), headers=headers)
data=open(save_path + service_name + '/' + service_name + '.json', 'rb')
print(r.content)

example.json

{
 "application": "env",
 "expectedArtifacts": [
  {
   "defaultArtifact": {
    "kind": "custom",
    "name": "example-service_deployment.yaml",
    "reference": "https://example.com",
    "type": "http/file"
   },
   "matchArtifact": {
    "kind": "custom",
    "name": "example-service_deployment.yaml",
    "reference": "https://example.com",
    "type": "http/file"
   },
   "useDefaultArtifact": true,
   "usePriorExecution": false
  }
 ],
 "index": 4,
 "keepWaitingPipelines": false,
 "lastModifiedBy": "john.doe@example.com",
 "limitConcurrent": true,
 "name": "example-service",
 "stages": [
  {
   "account": "kubernetes",
   "cloudProvider": "kubernetes",
   "manifestArtifactAccount": "bitbucket-stash",
   "manifestArtifactId": "3240b93c-c980-4654-b391-136601d56679",
   "moniker": {
    "app": "env"
   },
   "name": "Deploy (Manifest)",
   "refId": "1",
   "relationships": {
    "loadBalancers": [],
    "securityGroups": []
   },
   "requisiteStageRefIds": [],
   "source": "artifact",
   "type": "deployManifest"
  }
 ],
 "triggers": [
  {
   "enabled": true,
   "expectedArtifactIds": [],
   "payloadConstraints": {
    "service": "example-service"
   },
   "source": "service-deployment",
   "type": "webhook"
  }
 ],
 "updateTs": "1541507182000"
}

Код, сгенерированный почтальоном

import requests

url = "http://spinnaker-api.example.com/pipelines"

payload = "{\n \"application\": \"env\",\n \"expectedArtifacts\": [\n  {\n   \"defaultArtifact\": {\n    \"kind\": \"custom\",\n    \"name\": \"example-service_deployment.yaml\",\n    \"reference\": \"https://example.com\",\n    \"type\": \"http/file\"\n   },\n   \"matchArtifact\": {\n    \"kind\": \"custom\",\n    \"name\": \"example-service_deployment.yaml\",\n    \"reference\": \"https://example.com\",\n    \"type\": \"http/file\"\n   },\n   \"useDefaultArtifact\": true,\n   \"usePriorExecution\": false\n  }\n ],\n \"index\": 4,\n \"keepWaitingPipelines\": false,\n \"lastModifiedBy\": \"john.doe@example.com\",\n \"limitConcurrent\": true,\n \"name\": \"example-service\",\n \"stages\": [\n  {\n   \"account\": \"kubernetes\",\n   \"cloudProvider\": \"kubernetes\",\n   \"manifestArtifactAccount\": \"bitbucket-stash\",\n   \"manifestArtifactId\": \"3240b93c-c980-4654-b391-136601d56679\",\n   \"moniker\": {\n    \"app\": \"env\"\n   },\n   \"name\": \"Deploy (Manifest)\",\n   \"refId\": \"1\",\n   \"relationships\": {\n    \"loadBalancers\": [],\n    \"securityGroups\": []\n   },\n   \"requisiteStageRefIds\": [],\n   \"source\": \"artifact\",\n   \"type\": \"deployManifest\"\n  }\n ],\n \"triggers\": [\n  {\n   \"enabled\": true,\n   \"expectedArtifactIds\": [],\n   \"payloadConstraints\": {\n    \"service\": \"example-service\"\n   },\n   \"source\": \"service-deployment\",\n   \"type\": \"webhook\"\n  }\n ],\n \"updateTs\": \"1541507182000\"\n}"
headers = {
    'Content-Type': "application/json",
    'Authorization': "Bearer token",
    'cache-control': "no-cache",
    'Postman-Token': "postman-token"
    }

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)

Я рассмотрел следующие подходы, но ни один из них, похоже, не работает:

как отправить содержимое файла JSON в RESTFUL API с помощью Python, используя модуль запросов

какотправить POST содержимое файла JSON в RESTFUL API с помощью Python, используя модуль запросов

Обновление

, поэтому почтальон имеет один дополнительный заголовок: 'cookie':"SESSION=1233647d3d-a91d-3ce6-af1d-b14cd7fde472"

Добавив это в заголовок request_post.py, я смог получить желаемый результат (так же, как почтальон).Теперь не знаю, почему этот метод сессионных cookie-запросов работает нормально и почему я не могу сделать то же самое без этого заголовка.

...