私はリクエストPython 2.7を使用してカールポストクエリを実行しようとしていますが、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を返します。
どんな助けでも大歓迎です。
回答 2 件
実際、カールには-F filedata=@file1.txtがありますが、スクリプトにはfiles = {'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])
関連記事
- Python AttributeError:モジュール 'requests'には属性 'get_price'がありません
- Pythonはスクレイプイメージを要求し、「data:image /」の形式でsrcを返します
- matplotlibを使用してPythonでnetCDFを操作する
- Pythonで壊れたパイプエラーを修正する方法は? (IRCクライアントでの作業)
- 承認トークンをPythonリクエストヘッダーに渡す方法
- PythonリクエストでFlaskアプリケーションにファイルをアップロードする方法
- Falseの値に対して条件が機能しないのに、なぜpythonなのですか?
- GoogleFontsリクエストの組み合わせが機能しない
- Python:リクエストを使用してAPIにPATCHリクエストを行う方法
- PythonリクエストPOST:400:Pythonリクエストでの不正なリクエスト
一見したところ、そのスクリプトが失敗する理由とカールが機能する理由は複数あります。
nodeType=content
カール中、"nodeType":"cm:content"
スクリプトでスクリプトのペイロードの2行目に追加のコンマがあります
あなたは設定していませんコンテンツタイプ
multipart/form-data
としてのヘッダー スクリプト内で、curl
の-F
オプションは実際にまた、エンドポイントは400応答とともに詳細エラーを提供する必要があります。存在する場合、エラーの原因を特定するのに役立ちます。