Dalam desain antarmuka REST, menggunakan RestTemplate untuk pengujian antarmuka adalah metode umum, tetapi selama penggunaan, karena banyak metode dan parameter, banyak siswa telah membingungkan perbedaan antara metode pengiriman formulir dan muatan. Selain itu, desain antarmuka berbeda dari metode pengiriman yang digunakan oleh browser tradisional. Berbagai kesalahan sering terjadi, seperti 405 kesalahan, atau data yang diajukan tidak dapat diperoleh sama sekali. Sampel kesalahan adalah sebagai berikut:
Pengecualian di utas "org.springframework.web.client.httpclienterrorException: 405 tidak diperbolehkan
di org.springframework.web.client.defaultresponseErrorHandler.handleError (defaultresponseErrorHandler.java:63)
di org.springframework.web.client.resttemplate.handleresponse (resttemplate.java:700)
di org.springframework.web.client.resttemplate.doexecute (resttemplate.java:653)
di org.springframework.web.client.resttemplate.execute (resttemplate.java:613)
di org.springframework.web.client.resttemplate.exchange (resttemplate.java:531)
1. Kirim Menggunakan Metode Exchange
Exchange dapat mengeksekusi kedua metode pos dan mendapatkan, jadi itu adalah yang paling banyak digunakan dan penggunaannya adalah sebagai berikut:
String url = "http: // localhost/mirana-ee/app/login"; resttemplate client = baru resttemplate (); header httpheaders = httpheaders baru (); // tolong jangan mengubah metode pengiriman ini dengan mudah. Dalam kebanyakan kasus, metode pengiriman adalah header pengiriman form.setContentType (mediatype.application_form_urlencoded); // Encapsulate parameter, jangan menggantinya dengan peta dan hashmap, jika tidak parameter tidak dapat dilewati multivaluemap <string, params> params = new LinkEdmulnaMap <String, String, (String) (String, PARAMS = PARAMS = NEW LINKEDMULTAVALUEMAP <String, String, String, String, String/ PARAMS = STRING. "nama pengguna"); params.add ("kata sandi", "123456"); httpentity <multivaluemap <string, string >> requestEntity = httpentity baru <multivaluemap <string, string, klien, header); // http http requestedentity <string, string, client.exchange); String.class); // output hasil sistem.out.println (response.getBody ());2. Kirim dengan postforentity
postforentity adalah penyederhanaan pertukaran, dan hanya membutuhkan pengurangan parameter httpmethod.post, sebagai berikut:
// Kode di atas persis sama // Anda hanya perlu mengganti Metode Exchange ResponEntity <String> response = client.postforEntity (url, requestEntity, string.class);
3. Tentang Perbedaan Antara Pengajuan Formulir dan Pengajuan Payload
Dalam parameter metode pengontrol, jika Anda mengubah "@modelattribute" menjadi anotasi "@RequestBody", metode pengiriman saat ini adalah metode payload. Contoh kode adalah sebagai berikut:
// Harap dicatat bahwa @RequestBody annotation @RequestMapping (value = "/login", Method = requestMethod.post, Consumptions = "Application/JSON") // Never Add @ModelAttribute, jika tidak, ini akan ditimpa, sebagai berikut // Akun Publik GetAccount ( @requestbody @Modelattribute Accounts. Tanggal()); Mengembalikan akun;}
Sekali lagi, jangan tambahkan "@modelattribute" lagi, karena prioritasnya relatif tinggi, sistem akan menggunakan formulir untuk menguraikan konten yang dikirimkan.
Untuk metode payload, konten yang dikirim harus string, dan header harus diatur ke "Application/JSON". Contohnya adalah sebagai berikut:
// Permintaan alamat string url = "http: // localhost/mirana-ee/app/login"; resttemplate client = baru resttemplate (); // pastikan untuk mengatur headerhttpheaders headers = new httpheaders (); headers.setContentType (mediatype.application_json.pingphoner (); headers. ObjectMapperObjectMapper mapper melalui injeksi kacang = new ObjectMapper (); peta <string, string> params = maps.newhashMap (); params.put ("nama pengguna", "inter"); params.put ("kata sandi", "123456"); nilai string = mapper.writevalueasstring (params); hembba); hembba = hembarpen = hrtevalue (params); 123456 "); string = writevalueasstring (params); hePorper = hrteRpinger = hrteRpalUeasString (PARAMS); HOVETPERICITY; Httpentity <string> (value, header); // Jalankan http permintaan responsEntity <string> respons = client.postForEntity (url, requestEntity, string.class); system.out.println (response.getBody ());Jika konten tidak dikirimkan dalam mode string, kesalahan berikut pasti akan muncul:
Pengecualian di utas "utama" org.springframework.web.client.httpclienterrorexception: 400 permintaan buruk
di org.springframework.web.client.defaultresponseErrorHandler.handleError (defaultresponseErrorHandler.java:63)
di org.springframework.web.client.resttemplate.handleresponse (resttemplate.java:700)
di org.springframework.web.client.resttemplate.doexecute (resttemplate.java:653)
di org.springframework.web.client.resttemplate.execute (resttemplate.java:613)
di org.springframework.web.client.resttemplate.postforentity (resttemplate.java:407)
Akhirnya, harus ditekankan bahwa parameter permintaan tidak dapat diperoleh melalui @RequestBody. Jika kode pada server di atas diubah ke format berikut, Anda pasti tidak akan mendapatkan data, tetapi yang sebaliknya berlaku untuk pengiriman formulir.
@RequestMapping (value = "/Login", konsumen = "Application/JSON", Method = requestMethod.post) Akun Publik GetAccount (@RequestBody Account, permintaan httpservletRequest) {// Anda tidak boleh mendapatkan sistem nilai parameter.out.println (request.getParameter ("username")); Account.setVersion (tanggal baru ()); Mengembalikan akun;}4. Struktur httpentity
Httpentity adalah enkapsulasi permintaan HTTP, yang berisi dua bagian, header dan tubuh. Header digunakan untuk mengatur header permintaan, dan tubuh digunakan untuk mengatur badan permintaan, jadi konstruktornya adalah sebagai berikut:
// Nilai adalah Badan Permintaan // Header adalah header permintaan httpentity <string> requestEntity = httpentity baru <string> (nilai, header);
5. Httpentity dan Urivariable
Dalam penggunaan restemplate, httpentity digunakan untuk melewati nilai parameter tertentu, sedangkan Urivariable digunakan untuk memformat alamat HTTP alih -alih parameter alamat. Penggunaan yang benar adalah sebagai berikut:
// Tambahkan parameter pemformatan pathstring url = "http: // localhost/mirana-ee/app/{path}"; // persiapkan parameter format peta <string, string> varparams = maps.newhashmap (); varparams.put ("jalur", "login"); // Cods lainnya (); varparams.put ("path", "Login");//cod lain yang diterapkan (); codsed oMoTited/cod-cod lain yang diterapkan//petak/login "ompres ompres ompres ompres oMaPITIDE (" client.postforEntity (url, requestEntity, string.class, varparams);6. Catatan di httpmessageConverter
Dalam banyak contoh online, saya menemukan bahwa banyak orang telah menambahkan httpmessageConverter khusus untuk menangani pengiriman muatan, sebagai berikut:
// Tidak perlu client.getMessageConVertters (). Tambah (MappingJackson2httpMessageConverter ()) baru; client.getMessageConVerters (). Tambah (StringHttpMessageConverter () baru ());
Kemudian, setelah saya memeriksa kode sumber dan men-debug, saya menemukan bahwa RestTemplate memiliki 7 jenis httpmessageConverters, sebagai berikut:
1. Org.springframework.http.converter.bytearrayhttpMessageConverter
2. Org.springframework.http.converter.stringhttpMessageConverter
3. Org.springframework.http.converter.resourcehttpMessageConverter
4. Org.springframework.http.converter.xml.sourcehttpMessageConverter
5. org.springframework.http.converter.support.allencompassingFormHttpMessageConverter
6. org.springframework.http.converter.xml.jaxb2rootelementHttpMessageConverter
7. org.springframework.http.converter.json.mappingjackson2httpmessageConverter
“`
sebagai kesimpulan
RestTemplate dapat sangat menyederhanakan kesulitan mengirimkan data formulir dan dilengkapi dengan fungsi secara otomatis mengonversi data JSON. Namun, hanya dengan memahami struktur komposisi httpentity (header dan body) dan memahami perbedaan dengan urivariabel, dapatkah kita benar -benar memahami penggunaannya.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.