Faraday: Tetapkan parameter array dari array Ruby

Dibuat pada 1 Sep 2011  ·  26Komentar  ·  Sumber: lostisland/faraday

Faraday seharusnya memungkinkan Anda untuk mengatur parameter array menggunakan sintaks berikut:

Faraday.new(:url => 'http://localhost:1234').get do |request|
  request.url('foo', 'bar' => ['baz', 'qux'])
end

Saat ini, melakukan ini membuat permintaan berikut:

GET /foo?bar=baz&bar=qux

Saya mengusulkan itu harus membuat permintaan ini sebagai gantinya, sesuai dengan Rak:

GET /foo?bar[]=baz&bar[]=qux

Saat ini, untuk mendapatkan hasil ini, Anda harus membuat permintaan Anda seperti ini, yang agak jelek:

Faraday.new(:url => 'http://localhost:1234').get do |request|
  request.url('foo', 'bar[]' => ['baz', 'qux'])
  #                      ^ eww, gross
end

Membahas.

Komentar yang paling membantu

Maaf saya agak terburu-buru dan tidak dapat memberikan contoh di sini, tetapi Anda dapat melihat contoh yang baik dari pengujian di #199:

def test_build_url_bracketizes_repeated_params_in_query
  conn = Faraday::Connection.new
  uri = conn.build_url("http://sushi.com/sake.html", 'a' => [1, 2])
  assert_equal "a%5B%5D=1&a%5B%5D=2", uri.query
end

def test_build_url_without_braketizing_repeated_params_in_query
  conn = Faraday::Connection.new
  conn.options[:params_encoder] = Faraday::FlatParamsEncoder
  uri = conn.build_url("http://sushi.com/sake.html", 'a' => [1, 2])
  assert_equal "a=1&a=2", uri.query
end

Singkatnya, Faraday sekarang secara default membuat serial array "the rack way" dengan "[]" setelah nama variabel.
Namun, Anda dapat mengatur Faraday::FlatParamsEncoder sebagai params_encoder untuk membuatnya bersambung tanpa tanda kurung.

Semua 26 komentar

Saya agak bingung dalam hal ini — konvensi penggunaan bar[] adalah yang berasal dari Rails (dan diadopsi oleh rack).

Spesifikasi CGI mendukung apa yang dilakukan faraday saat ini (seperti halnya perpustakaan CGI ruby).

Jika kita membuat perubahan, saya tidak yakin bagaimana Anda bisa melewati mereka seperti sekarang...

Mengapa Anda ingin melakukan itu? Ini mirip dengan membuat hash Ruby seperti ini:

{'bar' => 'baz', 'bar' => 'qux'}

Tentu, itu sintaks yang valid, tetapi hash yang dihasilkan hanya akan memiliki satu nilai, jadi untuk semua maksud dan tujuan, itu tidak ada gunanya.

Sejujurnya, tidak ada yang berbeda sejauh penguraian dasar antara memiliki dua bidang dalam string kueri yaitu bar[] vs bar . Sufiks [] adalah konvensi yang dibuat oleh Rails untuk membuatnya sehingga konsumen hash dari params kueri tidak perlu khawatir jika kunci yang diberikan akan mengembalikan satu elemen atau larik.

Jika Anda melihat pustaka CGI Ruby, Anda dapat melihatnya benar-benar mengembalikan array untuk mengurai dua bar s:

>> CGI.parse('bar=baz&bar=qux')
=> {"bar"=>["baz", "qux"]}

Berikut info lebih lanjut tentangnya: http://en.wikipedia.org/wiki/Query_string

Sayangnya membuat Faraday mematuhi konvensi yang dibuat oleh Rails ini dapat membuatnya jauh lebih sulit untuk berinteraksi dengan beberapa jenis titik akhir HTTP lainnya.

Salah satu solusi untuk ini mungkin dengan menulis beberapa middleware permintaan Faraday sederhana yang melakukan perbaikan ini untuk Anda.

Saya mengerti maksud Anda. Saya kira saya condong ke arah Faraday meniru perilaku Rack agar konsisten dengan perpustakaan lainnya.

Itu masuk akal untuk kerangka kerja Ruby tetapi tidak masuk akal untuk beberapa kerangka kerja lain yang menguraikan skema saat ini dengan benar. Saya tidak yakin pendekatan apa yang harus kita ambil di sini, tetapi karena kita berada di dunia ruby, saya pikir kita harus mengikuti cara Anda dan membuat serial array dengan menambahkan "[]" ke kunci.

Saya benar-benar khawatir bahwa hal-hal semacam ini terjadi di belakang layar yang menyebabkan kebingungan bagi pengguna...

Ya @eric mungkin benar. Kami dapat membiarkannya apa adanya dan mendorong pengguna untuk memposting JSON ke aplikasi Ruby? Dengan begitu mereka tidak perlu khawatir tentang konvensi serialisasi.

Kami dapat membiarkannya apa adanya dan mendorong pengguna untuk memposting JSON ke aplikasi Ruby?

Ha. Anda lucu.

Saya mengalami masalah ini saat menerapkan metode baru di Twitter API . Apakah Anda pikir saya akan beruntung meyakinkan mereka?

Saya akan menambahkan bahwa POST bukanlah kata kerja yang sesuai untuk setiap permintaan HTTP. Apakah Anda menyarankan objek JSON penyandian URL dan menambahkannya ke string kueri untuk permintaan GET ? Sesuatu seperti:

GET /foo?body=%7B%22bar%22%3A%5B%22baz%22%2C%22qux%22%5D%7D

Ya Tuhan, semoga tidak.

Saya benar-benar berpikir masuk akal bagi kami untuk membuat middleware standar-ish yang dapat Anda masukkan jika Anda menginginkan pengkodean gaya Rails.

Saya akan baik-baik saja dengan solusi itu, meskipun saya agak khawatir kami menggunakan middleware sebagai palu Maslow.

Selain implementasi, saya ingin membuat kasus bahwa ini harus menjadi perilaku default, karena sepertinya kasus penggunaan yang lebih umum dan lebih sesuai dengan desain keseluruhan proyek ini.

Omong-omong, ini bukan hanya soal Ruby/Rails. Metode jQuery.param() membuat serial array dengan tanda kurung pada versi 1.4.

$.param({bar: ['baz', 'qux']}) // "bar[]=baz&bar[]=qux"

Tampaknya ini juga merupakan perilaku default di PHP . Bahkan, saya berani bertaruh konvensi ada di satu atau lebih kerangka kerja PHP sebelum ada di Rails.

Anda benar, @sferik , saya lupa tentang GET params.

Saya memilih untuk mengubah perilaku untuk menambahkan tanda kurung karena tampaknya lazim di komunitas kami yang lebih luas. Middleware UrlEncoded harus menangani ini. Middleware ini juga bisa memiliki opsi untuk mematikannya.

conn.request :url_encoded, bracketize: false

Saran bagaimana memanggil opsi ini selamat datang.

Saya telah dipanggil! Heh.

RFC 3986 mencakup URI. Bagian 3.4 mencakup string kueri dalam URI. Saya tidak melihat sesuatu yang khusus mencakup kunci duplikat, atau konvensi tentang cara menanganinya. Jadi ini sebagian besar merupakan keputusan estetika.

Secara pribadi, saya suka []s.

Anda punya pemikiran, @technoweenie?

@sferik : Sangat menarik bahwa jQuery juga mengikuti konvensi itu. Saya ingin melihat asal usulnya. Saya tidak percaya saya pernah melihatnya di mana pun sebelum Rails.

@mislav : Saya bisa melihat itu...

Semua orang: Apakah benar-benar tidak nyaman untuk menentukan "bar[]" atau asimetri yang mengganggu?

Selama kami membuat poin untuk mendokumentasikan opsi dengan sangat jelas, saya tidak akan merasa mual tentang hal itu. Saya sangat prihatin dengan hal-hal semacam ini yang melakukan keajaiban di balik selimut yang mengharuskan orang menggali lebih dalam untuk menemukan solusi atas perilaku yang membingungkan mereka (jika mereka datang dari perspektif yang berbeda).

Perhatian utama saya adalah tentang memiliki perilaku default yang benar.

Saya mendapati diri saya dalam posisi perlu membuat URL yang terlihat seperti:

GET /foo?bar[]=baz&bar[]=qux

Tebakan pertama saya tentang cara melakukannya adalah:

request.url('foo', 'bar' => ['baz', 'qux'])

Secara umum, salah satu hal favorit saya tentang Ruby adalah tebakan pertama saya tentang bagaimana melakukan sesuatu sering kali "berhasil". Karena Ruby memiliki sintaks yang fleksibel, komunitas kami lebih menekankan pada pembuatan antarmuka seintuitif mungkin. Dalam hal ini, intuisi saya gagal, jadi saya membuka masalah ini untuk melihat apakah orang lain memiliki intuisi yang sama tentang cara kerjanya _seharusnya_.

Saya suka proposal @mislav untuk mengaktifkan perilaku ini secara default di middleware UrlEncoded .

Saya setuju bahwa itu harus mungkin untuk dinonaktifkan. Saya juga setuju bahwa itu harus didokumentasikan dengan jelas.

Dan saya juga tertarik untuk mendengar pendapat @technoweenie tentang masalah ini sebelum melanjutkan, namun, dia sedang bergerak sekarang, jadi kita mungkin perlu menunggu beberapa hari. Ini tentu bukan masalah mendesak. Hanya bugaboo kecil.

Saya akan mengatakan pergi dengan tanda kurung secara default. Jangan seperti ASP!

Request.QueryString("chkFoo")(1)

Saya pikir melakukannya di middleware dengan cara sederhana untuk mengganti default pada basis per Koneksi adalah cara yang tepat untuk melakukannya.

Oke. Sepertinya aku kalah. Selama ada cara untuk menimpanya agar dapat berinteraksi dengan layanan lain yang tidak menggunakan notasi [] .

Menabrak. Middleware UrlEncoded menggunakan build_nested_query Rack untuk membuat serial params di badan permintaan, bahkan setelah kami menghapus ketergantungan Rack. Itu menambahkan [] ke kunci array. @sferik membuka diskusi ini untuk MENDAPATKAN params yang diserialkan menggunakan build_query , yang tidak menambahkan [] ke kunci array atau menangani params bersarang.

Jadi, masalah pertama adalah kami membuat serial params di badan POST secara berbeda dari string kueri GET. Kita harus mengatasi inkonsistensi ini dengan beralih dari build_query ke build_nested_query untuk GET params.

Masalah kedua adalah kunci array. Setelah kami konsisten, mereka akan secara otomatis mendapatkan sufiks dengan [] . Untuk menonaktifkannya, kami menyarankan opsi per permintaan (yang juga dapat dikonfigurasi per koneksi) seperti {bracketize: false} . Namun menerapkan ini tidak sepele untuk params GET seperti halnya untuk params POST, karena params GET diserialisasikan di Connection#build_url sementara param POST diserialisasikan di middleware UrlEncoded. Jadi, dua tempat yang sama sekali berbeda.

Ini bukan tidak mungkin. Kami dapat meneruskan opsi permintaan ke setiap pemanggilan build_url untuk membuatnya mengetahui pengaturan baru.

Ini muncul lagi sebagai #182.

Tidak ada yang menentang _mendukung_ konvensi [], tetapi pasti membutuhkan cara untuk mematikannya. Tidak semua layanan web di luar sana menggunakan konvensi, dan versi terbaru Faraday tidak memungkinkan untuk memanggil ini.

@sqrrrl Tepatnya.

@sferik Katakanlah saya merasa perlu membuat URL seperti:

GET /foo?bar=baz&bar=qux

Tebakan pertama saya tentang cara melakukannya adalah:

request.url('foo', 'bar' => ['baz', 'qux'])

Jadi saya tidak yakin itu benar-benar argumen yang mendukung notasi kurung siku.

Dan saya pikir ada argumen yang dapat dibuat bahwa beberapa orang mungkin benar-benar mencoba ini terlebih dahulu dalam skenario contoh Anda:

request.url('foo', 'bar[]' => ['baz', 'qux'])

Mengingat permintaan tarik #199 telah digabungkan, ini mungkin dapat ditutup.

Permintaan tarik agak kabur, akan lebih baik untuk menambahkan contoh cepat saat menutup masalah seperti itu :+1:

Maaf saya agak terburu-buru dan tidak dapat memberikan contoh di sini, tetapi Anda dapat melihat contoh yang baik dari pengujian di #199:

def test_build_url_bracketizes_repeated_params_in_query
  conn = Faraday::Connection.new
  uri = conn.build_url("http://sushi.com/sake.html", 'a' => [1, 2])
  assert_equal "a%5B%5D=1&a%5B%5D=2", uri.query
end

def test_build_url_without_braketizing_repeated_params_in_query
  conn = Faraday::Connection.new
  conn.options[:params_encoder] = Faraday::FlatParamsEncoder
  uri = conn.build_url("http://sushi.com/sake.html", 'a' => [1, 2])
  assert_equal "a=1&a=2", uri.query
end

Singkatnya, Faraday sekarang secara default membuat serial array "the rack way" dengan "[]" setelah nama variabel.
Namun, Anda dapat mengatur Faraday::FlatParamsEncoder sebagai params_encoder untuk membuatnya bersambung tanpa tanda kurung.

Hai Saya menghadapi masalah yang sama ketika saya mengirim parameter dengan array ke permintaan faraday. Itu menambahkan tanda kurung [] tambahan ke kunci. Saya mencoba menambahkan atribut params_encoder ke permintaan faraday tetapi mendapatkan kesalahan seperti metode yang tidak ditentukan params_encoder

Saya menggunakan versi faraday 0.9.2 dengan Rails 5.

Bisakah Anda membantu untuk memperbaikinya?

Hai @anushamummina , versi 0.9.2 seharusnya sudah berisi semua perubahan agar Anda dapat mengatur params_encoder . Apakah Anda dapat memberikan cuplikan kode untuk menunjukkan kesalahan yang Anda dapatkan?

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

iMacTia picture iMacTia  ·  3Komentar

QuinnWilton picture QuinnWilton  ·  4Komentar

ioquatix picture ioquatix  ·  4Komentar

asf-stripe picture asf-stripe  ·  3Komentar

jedeleh picture jedeleh  ·  3Komentar