Я пытаюсь сделать пост-запрос на сервере api, используя запросы python 3.7, выполнив следующие шаги:
- загрузите файл json
- вызовите 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-запросов работает нормально и почему я не могу сделать то же самое без этого заголовка.