Python 2.7 请求 REST API 调用与 curl 不同



我正在尝试使用请求python 2.7进行curl帖子查询,但是使用curl与请求lib的API响应不同。

后查询非常简单,文件和名称-值-对数据作为 API 参数。

以下是 curl 多部分发布请求:

curl -uadmin:blabla123 -X POST 127.0.0.1:8080/alfresco/api/-default-/public/alfresco/versions/1/nodes/6a0ab661-1c43-43ed-b07f-a564f6bcb5ca/children -F filedata=@file1.txt -F name=document__55;nodeType=content

python 2.7 代码如下:

import requests
from requests.auth import HTTPBasicAuth, HTTPDigestAuth
from config import USER, PASSWD
def createDocument( documentFilename, documentMetadata, targetFolderNodeId):
'''
Uploads a file and its meta-data to the CMIS server under the specified
target folder
'''
with open(documentFilename, 'rb') as file:
files = {'file': file}
# createURL = 'http://127.0.0.1:8080/alfresco/api/-default-/public/alfresco/versions/1/nodes/{0}/children'.format( targetFolderNodeId )
createURL = 'http://127.0.0.1:8080/alfresco/api/-default-/public/alfresco/versions/1/nodes/6a0ab661-1c43-43ed-b07f-a564f6bcb5ca/children'
data =  {
"name":"document__55",
"nodeType":"cm:content", 
}
response = requests.post( createURL, data = data, files = files, auth=HTTPBasicAuth(USER, PASSWD) )
print(response)
print(response.json)
print(response.text)
createDocument('file1.txt', '', '')

curl 返回 200 http 代码,但脚本奇怪地返回 400。

任何帮助都非常感谢。

乍一看,该脚本失败与 curl 工作的原因可能不止一个:

  • nodeType=content在卷曲中,而"nodeType":"cm:content"在脚本中
  • 脚本的有效负载第二行中还有一个额外的逗号
  • 您没有将内容类型标头设置为脚本中的multipart/form-data,而curl-F选项实际上可以

此外,终结点应提供详细错误以及 400 响应。如果是这样,则可能有助于确定错误原因。

实际上在卷曲中我有 -F filedata=@file1.txt但在脚本中我有文件 = {'file': file} 这是不一样的,所以我只需要使用 files = {'filedata': file} :)

def createDocument( documentFilename, documentMetadata, targetFolderNodeId):
'''
Uploads a file and its meta-data to the CMIS server under the specified
target folder
'''
with open(documentFilename, 'rb') as file:
files = {'filedata': file}
createURL = 'http://127.0.0.1:8080/alfresco/api/-default-/public/alfresco/versions/1/nodes/{0}/children'.format( targetFolderNodeId )
data =  {
"name":"document__77",
"nodeType":"cm:content"
}
response = requests.post( createURL, data = data, files = files, auth=HTTPBasicAuth(USER, PASSWD) )
print(response)
print(response.json)
print(response.text)
print(response.headers)
# print([i for i in dir(response) if 'header' in i])

最新更新