Angular.js: encodeUriSegment di resource encode params, harus opsional

Dibuat pada 19 Sep 2012  ·  55Komentar  ·  Sumber: angular/angular.js

Saat memiliki $resource dan mengirimkan param untuk digunakan di url, alangkah baiknya jika ada opsi untuk tidak menyandikannya. OOB itu mengkodekan (dalam hal ini "jalur") param sebelum cocok dengan url. Sebagai contoh

// In SomeResourceName factory:
$resouce('/:path',  { path: 'default.json' }, ...)
// Useing SomeResourceName
SomeResourceName.get({ path: 'game/mygame.json' })

Ini akan menghasilkan panggilan ke url "/game%2Fmygame.json" alih-alih "/game/mygame.json".

Ada solusi perbaikan cepat:

// In angular-resource.js and method encodeUriSegment
  function encodeUriSegment(val) {
    return encodeUriQuery(val, true).
      replace(/%26/gi, '&').
      replace(/%3D/gi, '=').
      replace(/%2B/gi, '+'). 
      replace(/%2F/gi, '/'); // <--- Add this line
  }

Saya tidak tahu apa yang akan rusak, tetapi setahu saya itu berhasil untuk saya. Seseorang juga dapat membajak argumen actions di ResourceFactory dan meneruskan flag encode lewati ke argumen default konstruktor Route untuk memintanya melewati encoding.

Lots of comments ngResource moderate more info feature

Komentar yang paling membantu

@ibrahim89 , pastikan Anda menggunakan versi angular dan angular-resource yang sama.

Semua 55 komentar

Membuat inti dengan perubahan untuk pembajakan :) https://Gist.github.com/3749345

+1 untuk ini. Memberikan fleksibilitas yang lebih besar. Dalam kasus penggunaan kami, kami menggunakan sisa data pegas untuk backend dan metode pencarian adalah parameter jalur yang perlu kami petakan ke tindakan, idealnya dalam objek sumber daya yang sama seperti untuk operasi CRUD dasar.

+1. Id kami berisi garis miring (kami menggunakan RavenDB) dan itu akan menjadi solusi bersih jika tidak dikodekan

Menjadikannya opsional tidak masalah, tetapi harap pastikan bahwa itu diaktifkan secara default.

Sangat tidak disarankan untuk tidak mengkodekan URI. Tidak melakukannya mungkin tampak "bersih" sekarang tapi saya jamin itu akan menggigit Anda di kehidupan ini atau selanjutnya.

Jika saya membaca http://www.ietf.org/rfc/rfc3986.txt dengan benar, kita harus mengizinkan garis miring yang tidak dikodekan untuk fragmen.

3.5. Pecahan

Komponen pengidentifikasi fragmen dari URI memungkinkan
identifikasi sumber daya sekunder dengan mengacu pada sumber primer
sumber daya dan informasi pengidentifikasi tambahan. yang teridentifikasi
sumber daya sekunder mungkin beberapa bagian atau subset dari sumber primer
sumber daya, beberapa pandangan tentang representasi sumber daya utama, atau
beberapa sumber daya lain yang didefinisikan atau dijelaskan oleh representasi tersebut. SEBUAH
komponen pengenal fragmen ditunjukkan dengan adanya a
karakter tanda angka ("#") dan diakhiri pada akhir URI.

 fragment    = *( pchar / "/" / "?" )

...
Karakter garis miring ("/") dan tanda tanya ("?") diperbolehkan untuk
mewakili data dalam pengidentifikasi fragmen. Waspadalah bahwa beberapa
implementasi yang lebih lama dan salah mungkin tidak menangani data ini dengan benar
ketika digunakan sebagai URI dasar untuk referensi relatif (Bagian
5.1).

Kasus penggunaan: $location.hash('/secondary-resource')

Saya hanya ingin tahu, apakah mungkin untuk menghindari masalah ini dengan mengkodekan ganda params Anda?

Maaf, itu kemudian membuatnya lebih buruk. Sekedar konfirmasi saya mencoba beberapa open meskipun rasanya sia-sia!

'/', '%252F' --> %25252F

Juga,

/ %2f --> %252F
'/', '//' --> %2F%2F

Terima kasih atas pemikirannya. Permintaan masih berlaku.

Berlari ke ini hari ini. +1
Saya mungkin tidak menyukainya, tetapi id kami juga mengandung garis miring. Ini harus opsional.

+1

+1

+1

+1

+1

+1

Saya melihat penyebutan database (RavenDB) yang membuat implementasi saat ini bermasalah, tetapi saya berharap ada server perantara yang mengharapkan komponen yang disandikan, dan menerjemahkannya ke ID yang benar di backend. Bisakah seseorang memberikan kasus penggunaan yang lebih konkret di mana pengkodean paksa menyebabkan masalah (maaf saya tidak memiliki lebih banyak konteks di RavenDB)?

Kami ragu untuk mengizinkan ini dengan desain $resource saat ini, karena akan memudahkan masukan pengguna untuk memengaruhi jalur permintaan.

Saya menggunakan $location untuk desain REST/hypermedia dan bukan RavenDB (atau $resource). Saya harus bekerja dengan versi perpustakaan yang ditambal.

Saya juga mencari konfirmasi bahwa sebenarnya proposal ini benar-benar mengikuti RFC juga -lihat komentar saya di atas

Saya mungkin juga agak berkarat di sekitar perpustakaan - permintaan maaf yang sebesar-besarnya jika saya salah - ada juga dua implementasi satu di sumber daya di L332 dan satu di Angular di 1071 .

Saya hanya membutuhkan yang di Angular karena itulah yang digunakan oleh $location ;-) (ya, saya melihat masalahnya di sini jadi saya tidak akan menyarankan implementasi yang tidak berbeda). Mohon maaf jika ada analisa yang salah.

+1
Adakah yang punya solusi untuk membuat URL sumber daya yang berisi garis miring?

Sesuai dengan baris tambalan yang disebutkan di atas dalam file, dua implementasi juga disebutkan di atas . Ini menyakitkan.

Apakah ada gerakan ini?
Tambahkan saja titik di mana saya benar-benar dapat menggunakan opsi seperti itu sendiri.

hei disana,

saya memiliki masalah yang sama tetapi intinya tidak membuatnya bekerja untuk saya. di mana saya harus menempatkan metode encodeUirSegment ini atau di mana saya dapat menempatkan opsi ini? :/

Saya menggunakan pencegat HTTP untuk mengubah URL. Itu berfungsi sampai saya menguji pada IE11. Jeda sudut pada permintaan XHR ke URL termasuk % di IE11. Tidak yakin tentang IE10. Angular seharusnya mendukung IE9+ ( referensi )

Kira saya akan kembali ke ngResource yang dimodifikasi..

@connorbode --- Bung, seperti yang disebutkan dalam masalah Anda, tulis kasus uji yang gagal =) Jalur ini HARUS sudah dicakup, jadi ada dua kemungkinan, apakah itu tidak tercakup dan seharusnya, atau Anda melakukan sesuatu untuk dilanggar ini.

Mari kita cari tahu yang mana itu!

+1

+1

+1

Tidak mungkin bekerja dengan CouchDB dan dokumen desain (_design/cafehub/_view/menu_items)

Bisakah kalian memberi +1 permintaan tarik saya alih-alih masalah ini? Ini memperbaiki masalah tetapi umumnya diabaikan sejak pengajuannya. https://github.com/angular/angular.js/pull/7940

+1
Sangat membutuhkan ini untuk berinteraksi dengan beberapa layanan web lawas yang tidak melakukan URLdecode

+1

Pasti ada keadaan yang berguna dan layak di mana pengguna ingin menonaktifkan pengkodean parameter URL (misalnya, di mana Anda ingin menambahkan ke URL dasar jalur ke sumber daya).

+1

+1

+1

+1

@toddb hanya FYI, kutipan spesifikasi Anda merujuk ke bagian fragmen dari URL, yaitu bagian #foo/bar , di mana menghindari garis miring memang tidak diperlukan atau tidak sesuai. Tapi bug ini adalah tentang lolos dari garis miring di bagian jalur utama URL. Secara umum, saya tidak berpikir RFC berlaku untuk ini, bagaimana layanan $resource Angular menangani pencocokan pola dan konstruksi URL benar-benar tidak terlalu menjadi perhatian RFC.

Tidak keluar dari garis miring dalam parameter gaya :param biasa memiliki masalah yang membuat pola tidak dapat dibalik. Misalnya jika Anda memiliki /x/:param , dan Anda mengizinkan pembuatan /x/y/z untuk {param: 'y/z'} , /x/y/z yang dihasilkan akan gagal diurai terhadap pola URL.

IMHO mungkin masuk akal untuk memiliki fitur dalam pola URL untuk menerima pola bintang yang memakan garis miring, misalnya "/:param1/:param2/*pathParam" , di mana *pathParam akan memakan garis miring di URL. Untuk * params, masuk akal untuk juga menerima garis miring tanpa menghindarinya.

@mprobst - Anda cukup benar bahwa saya mencatat bug hanya di sekitar fragmen. Kode yang saya gunakan _also_ mempengaruhi fragmen. Saya tidak menggunakan layanan $resource melainkan $location . Jika ingatan saya, ada beberapa implementasi kode uriSegment.

Tambalan oleh @connorbode dari pembacaan cepat akan mengatasi masalah tersebut. Bersulang

+1

+1

+1

+1

+1

+1

+1

+1

Anda dapat menggunakan sintaks yang sama seperti di ui-router lib :
http://angular-ui.github.io/ui-router/site/#/api/ui.router.util.type :UrlMatcher

+1

itu juga terjadi di lokasi

:+1:

+1

Saat ini saya sedang melakukan dekode untuk mengirim url asli saya ke backend

.factory('decodeUriSegment', () => {
    return (url) => {
      return url.replace(/@/g, '%40')
        .replace(/:/g, '%3A')
        .replace(/\$/g, '%24')
        .replace(/,/g, '%2C')
        .replace(/\+/g, '%20');
    };
  });

+1

+1

app.config(function($resourceProvider) {
    $resourceProvider.defaults.stripTrailingSlashes = false;
});

https://github.com/angular/angular.js/pull/5560

+1

saya mendapatkan kesalahan ini di angularjs $resource service
Kesalahan: encodeUriSegment bukan fungsi

@ibrahim89 , pastikan Anda menggunakan versi angular dan angular-resource yang sama.

@gkalpak , terima kasih!!

kesalahan saya terpecahkan

Apakah halaman ini membantu?
0 / 5 - 0 peringkat