我正在尝试使用请求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])