Saya memiliki ikal kerja berikut

curl -v -i -H "Content-Type:multipart/form-data" -H "X-Authorization: 12345" -F "file0=@/path/to/image.jpg" -d 'jsonData={ "data": { "field1": 1, "field2": 2 } }' -X POST http://example.com/url/path

Saya mencoba membuat permintaan yang sama persis dengan python dan menghasilkan yang berikut:

    headers = {
        'Content-Type': 'multipart/form-data',
        'X-Authorization': '12345',
    }

    files = {
        'file0': ('/path/to/image.jpg',
                  open('/path/to/image.jpg', 'rb')),

    }

    file_post = requests.post('http://example.com/url/path',
                                headers=headers,
                                files=files,
                                data={
                                    "jsonData": {
                                        "data": {
                                            "field1": 1,
                                            "field2": 2,
                                        }
                                    }
                                })

Masalahnya adalah saya mendapatkan respons berbeda untuk curl dan python. Apakah permintaan ini tidak setara atau haruskah saya mencari di tempat lain?

0
gerald 11 Desember 2017, 17:25

1 menjawab

Jawaban Terbaik

Anda tidak bisa begitu saja memasukkan kamus Python tanpa menyandikannya ke JSON. Postingan curl Anda memiliki data yang disandikan JSON untuk bidang formulir jsonData, jadi kode Python Anda harus menyediakan hal yang sama:

import json

headers = {'X-Authorization': '12345'}

files = {
    'file0': ('/path/to/image.jpg',
              open('/path/to/image.jpg', 'rb')),
}
file_post = requests.post(
    'http://example.com/url/path',
    headers=headers,
    files=files,
    data={
        "jsonData": json.dumps({
            "data": {
                "field1": 1,
                "field2": 2,
            }
        })
    })

Dengan meneruskan kamus ke data, setiap nilai yang merupakan iterable, dilihat sebagai urutan nilai yang terpisah (jadi {'data': ['foo', 'bar']} diterjemahkan ke data=foo&data=bar) . Anda memasukkan kamus untuk kunci jsonData, yang merupakan iterable dan dengan demikian memperlakukan urutan nilai. Pada akhirnya Anda hanya memposting jsonData=data, tidak ada yang lain.

Dengan menggunakan nilai tunggal (dienkode JSON), Anda memberi tahu permintaan untuk meneruskan nilai itu secara langsung, sebagai nilai untuk kunci jsonData.

Menggunakan argumen kata kunci files juga memicu header Content-Type yang tepat, tidak perlu disetel secara manual.

0
Martijn Pieters 11 Desember 2017, 14:35