<p>permintaan memaksa menimpa penyandian string kueri</p>

Dibuat pada 11 Jul 2013  ·  3Komentar  ·  Sumber: psf/requests

Saya berurusan dengan platform lama yang tidak memahami parameter yang disandikan URL.

Saya memiliki parameter berikut:

params = {'fiz': 'foo:bar', 'biz': 'barfoo'}

url yang dihasilkan oleh permintaan

http://localhost/?fiz=foo%3Abar&biz=barfoo

url yang diperlukan untuk platform lama

http://localhost/?fiz=foo:bar&biz=barfoo

Saya mencoba membuat string kueri khusus dan menambahkannya ke url, namun permintaan akan mendekode kueri ini, dan menyandikannya kembali.

improt urllib
qry = urllib.urlencode(params).replace('%3A', ':')
requests.get(url+'?'+qry) #: requests encodes the colon back to %3A

Apakah ada pekerjaan cepat yang tidak terlihat bertele-tele seperti menggunakan urllib2 langsung?

apakah mungkin untuk mendapatkan daftar "aman" atau "ganti" yang terhubung ke API, ini perlu dilakukan pada lapisan permintaan karena python 2.7 diperlukan.

Komentar yang paling membantu

Ini agak canggung untuk dilakukan di Permintaan. Seperti yang saya lihat, Anda memiliki dua pilihan. Yang pertama adalah menyiapkan objek Request sendiri:

import requests
import urllib

url = 'http://test.com/'
qry = urllib.urlencode(params).replace('%3A', ':')

s = requests.Session()
req = requests.Request(method='GET', url=url)
prep = req.prepare()
prep.url = url + qry
r = s.send(prep)

Pilihan Anda yang lain adalah membuat Transport Adapter yang mengubah URL sebelum mengirimnya, seperti:

import requests
import urllib

class MutatingAdapter(requests.adapters.HTTPAdapter):
    def send(self, request, **kwargs):
        main, querystr = request.url.split('?') # Nasty hack, not always valid.
        querystr = urllib.unquote(querystr)
        querystr = urllib.quote(querystr, '/&:=')
        request.url = '?'.join([main, querystr])

        super(MutatingAdapter, self).send(request, **kwargs)

Semua 3 komentar

Ini agak canggung untuk dilakukan di Permintaan. Seperti yang saya lihat, Anda memiliki dua pilihan. Yang pertama adalah menyiapkan objek Request sendiri:

import requests
import urllib

url = 'http://test.com/'
qry = urllib.urlencode(params).replace('%3A', ':')

s = requests.Session()
req = requests.Request(method='GET', url=url)
prep = req.prepare()
prep.url = url + qry
r = s.send(prep)

Pilihan Anda yang lain adalah membuat Transport Adapter yang mengubah URL sebelum mengirimnya, seperti:

import requests
import urllib

class MutatingAdapter(requests.adapters.HTTPAdapter):
    def send(self, request, **kwargs):
        main, querystr = request.url.split('?') # Nasty hack, not always valid.
        querystr = urllib.unquote(querystr)
        querystr = urllib.quote(querystr, '/&:=')
        request.url = '?'.join([main, querystr])

        super(MutatingAdapter, self).send(request, **kwargs)

Saya merekomendasikan opsi pertama.

anda dapat mencoba parameter json dari request.post() dan request.get() http://stackoverflow.com/a/26344315/1056345

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

ghtyrant picture ghtyrant  ·  3Komentar

JimHokanson picture JimHokanson  ·  3Komentar

justlurking picture justlurking  ·  3Komentar

xsren picture xsren  ·  3Komentar

NoahCardoza picture NoahCardoza  ·  4Komentar