memposting file menggunakan permintaan python dan json

Saya telah diberi perintah curl berikut sebagai bagian dari dokumentasi API, dan saya mencoba menerapkannya menggunakan perpustakaan permintaan.

curl -v --cookie cookie.txt -X POST -H 'Accept: application/json' -F 'spot[photo]'[email protected] -F 'spot[description]'=spot_description -F 'spot[location_id]'=9  -F 'spot[categories][]'='See the Sights' -F 'spot[categories][]'='Learn Something' http://some.server.com/api/v1/spots

kode python saya terlihat seperti ini:

import requests
import json

_user = 'redacted'
_password = 'redacted'
_session = requests.session()
_server = 'http://some.server.com'

_hdr = {'content-type': 'application/json', 'accept': 'application/json'}

_login_payload = {
    'user': {
        'email': _user,
        'password': _password
    }
}
r = _session.post(_server + "/users/sign_in", data=json.dumps(_login_payload), headers=_hdr)
print json.loads(r.content)

_spot_payload = {
    'spot': {
        'photo': '@rails.gif',
        'description': 'asdfghjkl',
        'location_id': 9,
        'categories': ['See the Sights',]
    }
}
r = _session.post(_server + '/api/v1/spots', data=json.dumps(_spot_payload), headers=_hdr)
print json.loads(r.content)

Saya pernah mendengar bahwa Anda dapat menggunakan open('file').read() untuk memposting file, tetapi encoder json tidak terlalu menyukai ini, dan saya tidak yakin tentang cara mengatasinya.


person Leah    schedule 18.04.2012    source sumber
comment
Terkait: Menggunakan Pustaka Permintaan Python untuk Memposting File Teks   -  person Piotr Dobrogost    schedule 20.04.2012


Jawaban (1)


C:\>cat file.txt
Some text.

Saat Anda mengeluarkan perintah ini:

C:\>curl -X POST -H "Accept:application/json" -F "spot[photo][email protected]"
-F "spot[description]=spot_description" http://localhost:8888

apa yang dikirim terlihat seperti ini:

POST / HTTP/1.1 Agen Pengguna: curl/7.25.0 (i386-pc-win32) libcurl/7.25.0 OpenSSL/0.9.8u zlib/1.2.6 libssh2/1.4.0 Host: localhost:8888 Terima: application/ json Panjang Konten: 325 Harapkan: 100-lanjutan Tipe Konten: multipart/form-data; batas=-------------e71aebf115cd

------------------------------e71aebf115cd Konten-Disposisi: formulir-data; nama="tempat[foto]"; nama file="file.txt" Tipe Konten: teks/polos

Beberapa teks. ------------------------------e71aebf115cd Konten-Disposisi: formulir-data; nama="tempat[deskripsi]"

spot_deskripsi ---------------e71aebf115cd--

Seperti yang Anda lihat, curl mengirimkan permintaan dengan Content-Type disetel ke multipart/form-data; Permintaan mendukung pengiriman file menggunakan Content-Type. Anda harus menggunakan argumen files untuk ini.

(2.7) C:\>python
Python 2.7.3 (default, Apr 10 2012, 23:24:47) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests
>>> requests.__version__
'0.11.1'
>>> requests.post('http://localhost:8888', files={'spot[photo]': open('file.txt', 'rb')}, data={'spot[description]': 'spot_description'})
<Response [200]>

Dan yang dikirim terlihat seperti ini:

POST http://localhost:8888/ HTTP/1.1
Host: localhost:8888
Content-Length: 342
Content-Type: multipart/form-data; boundary=192.168.1.101.1.8000.1334865122.004.1
Accept-Encoding: identity, deflate, compress, gzip
Accept: */*
User-Agent: python-requests/0.11.1

--192.168.1.101.1.8000.1334865122.004.1
Content-Disposition: form-data; name="spot[description]"
Content-Type: text/plain

spot_description
--192.168.1.101.1.8000.1334865122.004.1
Content-Disposition: form-data; name="spot[photo]"; filename="file.txt"
Content-Type: text/plain

Some text.
--192.168.1.101.1.8000.1334865122.004.1--
person Piotr Dobrogost    schedule 19.04.2012
comment
Terima kasih telah menunjukkan betapa tidak sadarnya saya =). Saya mungkin seharusnya bisa memikirkannya sendiri. Namun, butuh waktu lama bagi saya untuk menghubungi Anda kembali karena ini tidak benar-benar berfungsi di kehidupan nyata, dan butuh beberapa saat sebelum saya mendapatkan kesalahan yang berguna. - person Leah; 02.05.2012
comment
Kesalahan yang dimaksud adalah TypeError: ‹open file 'logo.gif', mode 'rb' at [hex here]› is not JSON serializable. - person Leah; 02.05.2012
comment
Saya sejak menemukan ada masalah dalam kode di antara saya di mana saya mengirim file ke data daripada ke file. Server masih tidak menerima file dengan benar, tetapi python tidak lagi melakukan kesalahan apa pun. Saya khawatir karena alasan kerahasiaan, saya tidak dapat membagikan kode/alamat server sebenarnya. Langkah saya selanjutnya adalah menemukan alat untuk menangkap lalu lintas jaringan dari Mac saya ke server sehingga saya memiliki sesuatu yang konkret untuk diberikan kepada pengembang. Terima kasih atas semua bantuan Anda. - person Leah; 02.05.2012
comment
Mungkin Anda tahu mengapa pengkodean data dengan json gagal: data=json.dumps({'spot[description]': 'spot_description'}) - person Alex Kreimer; 05.12.2012
comment
@AlexKreimer Anda harus menanyakan ini sebagai pertanyaan terpisah. Pastikan juga itu belum ditanyakan. - person Piotr Dobrogost; 05.12.2012