URL ada di mana -mana, tetapi tampaknya pengembang tidak benar -benar memahaminya, karena saya sering melihat orang -orang bertanya bagaimana membuat URL dengan benar di stack overflow. Jika Anda ingin tahu cara kerja Sintaks URL, Anda dapat membaca artikel ini oleh Lunatech, yang sangat bagus.
Artikel ini tidak akan memperkenalkan seluruh sintaks URL secara mendalam (jika Anda ingin memahami URL sepenuhnya, Anda dapat membaca RFC 3986, RFC 1738, dan artikel yang disebutkan di atas, serta dokumentasi di atas W3). Di sini saya ingin berbicara tentang beberapa perpustakaan umum dalam URL operasi dan bagaimana menggunakannya dengan benar melalui URL-Builder. Ini adalah perpustakaan Java yang kami terbitkan untuk membuat URL dengan benar.
Pertanyaan 1: Urlencoder Java
Kelas ini tidak hanya bernama buruk, tetapi kalimat pertamanya dalam dokumen tidak terlalu benar.
Kelas utilitas untuk pengkodean formulir HTML.
Anda mungkin bertanya -tanya mengapa itu disebut urlencoder, tetapi Anda benar -benar terdiam ketika Anda melihat baris ini.
Jika Anda telah membaca posting blog Lunatech, Anda sekarang harus memahami bahwa Anda tidak dapat secara ajaib mengubah string URL menjadi objek URL yang aman dan dikodekan dengan benar melalui kelas ini. Tentu saja, jika Anda belum melakukan pekerjaan rumah yang cukup, berikut adalah contoh kecil untuk membantu Anda memahami.
Misalkan Anda memiliki titik akhir layanan http http://foo.com/search, yang menerima parameter kueri P, dan nilai P adalah string yang akan dicari. Jika Anda mencari string "You & I", URL pencarian yang Anda buat untuk pertama kalinya mungkin seperti ini: http://foo.com/search?q=you & I. Tentu saja ini tidak akan berhasil, karena & adalah pemisah yang memisahkan pasangan parameter kueri/pasangan nilai. Jika Anda mendapatkan string URL yang berantakan ini, Anda tidak berdaya karena pertama -tama, Anda tidak dapat menguraikannya dengan benar.
Oke, mari kita gunakan urlencoder. Urlencoder.encode ("you & i", "UTF-8") adalah hasil yang Anda+%26+i. Setelah mendekode %ini %26, itu adalah &, dan tanda + mewakili spasi dalam string kueri, sehingga URL ini dapat bekerja secara normal.
Sekarang misalkan Anda ingin menggunakan string kueri Anda untuk menyambungkan jalur URL alih -alih memasukkannya ke dalam parameter URL. Jelas, http://foo.com/search/you & saya salah. Sayangnya, hasil urlencoder.encode () juga salah. http://foo.com/search/you+%26+i akan mendapatkan/mencari/Anda+&+i, karena tanda+tidak akan diselesaikan ke spasi di jalur url.
Urlencoder dapat memenuhi beberapa skenario Anda. Sayangnya, nama yang terlalu umum memudahkan pengembang untuk menyalahgunakannya. Oleh karena itu, cara terbaik adalah tidak menggunakannya, sehingga pengembang lain akan membuat kesalahan saat menggunakan fungsi lain berdasarkan Anda (kecuali jika Anda benar -benar melakukan "pengkodean formulir HTML").
Pertanyaan 2: Groovy HttpBuilder dan Java's URI
HTTP Builder adalah Perpustakaan Klien HTTP Groovy.
Membuat permintaan Get normal sangat sederhana:
baru httpbuilder ("http: // localhost: 18080") .request (method.get) {uri.path = "/foo"}Kode ini akan mengirim GET /FOO HTTP /1.1 ke server (Anda dapat menjalankan NC -L -P 18080 dan kemudian menjalankan kode ini untuk memverifikasi).
Mari kita coba URL yang berisi ruang.
baru httpbuilder ("http: // localhost: 18080") .request (method.get) {uri.path = "/foo bar"}Ini mengirim /foo%20bar http /1.1, yang terlihat cukup bagus.
Sekarang anggaplah ada bagian di jalan kita yang disebut foo/bar. Ini tidak dapat dilakukan hanya dengan mengirim foo/bar, karena ini akan dianggap sebagai dua segmen di jalan, foo dan bar. Mari kita coba foo%2fbar (ganti / dengan pengkodean yang sesuai).
httpbuilder baru ('http: // localhost: 18080') .request (method.get) {uri.path = '/foo%2fbar'}Ini mengirimkan get /foo%252fbar http /1.1. Ini tidak terlalu bagus. %Dalam %2F berulang kali dikodekan, sehingga jalur yang diperoleh setelah decoding adalah foo %2fbar, bukan foo/bar. Hal yang nyata yang harus disalahkan di sini adalah java.net.uri, karena kelas Uribuilder di httpBuilder menggunakannya.
Jenis properti URI yang terpapar dalam penutupan konfigurasi dalam kode di atas adalah Uribuilder. Jika Anda memperbarui properti jalur dari URI melalui URI.Path =…, pada akhirnya akan memanggil konstruktor URI. Metode ini menjelaskan properti jalur yang masuk sebagai berikut:
Jika parameter jalur disediakan, itu ditambahkan ke URL. Karakter di jalur dikodekan selama tidak disesuaikan, diselingi, melarikan diri dan kategori lainnya (Catatan Penerjemah: Kategori ini dirinci dalam RFC 2396), dan bukan/atau @ bilangan.
Pendekatan ini tidak terlalu bermakna, karena jika teks sebelum pengkodean berisi karakter khusus, ia tidak dapat menghasilkan segmen jalur yang dikodekan dengan benar. Dengan kata lain, "Saya akan menyandikan string ini, dan setelah pengkodean itu benar", yang tentu saja merupakan kekeliruan, dan Uri kebetulan menjadi korban kekeliruan ini. Jika string telah dikodekan dengan benar, tidak ada masalah. Jika tidak, itu akan dilakukan karena string tidak dapat diuraikan. Faktanya, apa yang dikatakan dokumentasi tidak luput dari / berarti bahwa ia mengasumsikan bahwa string path telah dikodekan dengan benar (yaitu, itu digunakan dengan benar untuk memisahkan jalur), dan belum dikodekan dengan benar (bagian lain kecuali / masih perlu dikodekan).
Akan lebih bagus jika httpBuilder tidak menggunakan fungsi yang rusak dari kelas URI ini. Tentu saja, akan lebih baik jika URI itu sendiri baik -baik saja.
Cara yang benar untuk melakukannya
Kami menulis URL-Builder ini, yang dapat membantu pengembang dengan mudah menyambungkan berbagai jenis URL. Ini mengikuti spesifikasi pengkodean dalam bahan referensi di awal artikel, dan juga menyediakan API streaming. Contoh penggunaan berikut dapat mencakup hampir semua skenario penggunaan:
Urlbuilder.forhost ("http", "foo.com") .pathsegment ("dengan spasi") .pathsegments ("path", "dengan", "varargs") .pathsegment ("& =?/") .Queryparam ("fancy + name", "fancy? = Value"). .fragment ("#? =") .tourlString ()Hasilnya adalah: http://foo.com/with%20spaces/path/with/varargs/&=%3f%2f;Matrix=param%3f?fancy%20%2b%20name=fancy?%3DValue#%23?==
Contoh ini menunjukkan aturan penyandian yang berbeda untuk setiap bagian URL. Misalnya, yang tidak disandikan & = di jalur diizinkan, sementara?/ Perlu dikodekan, tetapi = perlu dikodekan dalam parameter kueri, tetapi? Nomor tidak membutuhkannya, karena ini sudah menjadi bagian dari string kueri (catatan penerjemah: String kueri dimulai dengan nomor?, sehingga dapat menyertakan nomor? Setelah itu).
Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!