Saya harus melakukan REST
panggilan yang menyertakan tajuk khusus dan parameter kueri. Saya mengatur saya HttpEntity
hanya dengan header (tanpa badan), dan saya menggunakan RestTemplate.exchange()
metode sebagai berikut:
HttpHeaders headers = new HttpHeaders();
headers.set("Accept", "application/json");
Map<String, String> params = new HashMap<String, String>();
params.put("msisdn", msisdn);
params.put("email", email);
params.put("clientVersion", clientVersion);
params.put("clientType", clientType);
params.put("issuerName", issuerName);
params.put("applicationName", applicationName);
HttpEntity entity = new HttpEntity(headers);
HttpEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class, params);
Ini gagal di ujung klien dengan dispatcher servlet
ketidakmampuan untuk menyelesaikan permintaan ke penangan. Setelah melakukan debug, sepertinya parameter permintaan tidak dikirim.
Ketika saya melakukan pertukaran dengan POST
menggunakan tubuh permintaan dan tidak ada parameter permintaan itu berfungsi dengan baik.
Adakah yang punya ide?
exchange
menjadigetForEntity
:restTemplate.getForEntity(builder.build().encode().toUri(), String.class);
untuk kesederhanaan.exchange
dan menyediakan aParameterizedTypeReference
. Contohnya dapat disederhanakan, digantibuilder.build().encode().toUri()
denganbuilder.toUriString()
.builder.toUriString()
Variabel uriVariabel juga diperluas dalam string kueri. Misalnya, panggilan berikut akan memperluas nilai untuk akun dan nama:
jadi url permintaan yang sebenarnya adalah
Lihatlah HierarchicalUriComponents.expandInternal (UriTemplateVariables) untuk lebih jelasnya. Versi Spring adalah 3.1.3.
sumber
UriComponentsBuilder
karena menyebabkannya menghasilkan metrik yang berbeda untuk setiap permintaan denganMicrometer
RestTemplate
memiliki metode paralel untuk menentukan array nilai posisi (Object... uriVariables
) atau peta nilai yang ditentukan (Map<String, ?> uriVariables
). Suara seperti versi peta adalah apa yang Anda inginkan:restTemplate.exchange(url, HttpMethod.GET, httpEntity, clazz, urlVariablesMap)
.Setidaknya sejak musim semi 3, alih-alih menggunakan
UriComponentsBuilder
untuk membangun URL (yang sedikit verbose), banyak dariRestTemplate
metode menerima placeholder di jalan untuk parameter (bukan hanyaexchange
).Dari dokumentasi:
Referensi: https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#rest-resttemplate-uri
Jika Anda melihat JavaDoc untuk
RestTemplate
dan mencari "Templat URI", Anda bisa melihat metode mana yang bisa Anda gunakan dengan placeholder.sumber
OK, jadi saya menjadi idiot dan saya membingungkan parameter kueri dengan parameter url. Saya agak berharap akan ada cara yang lebih baik untuk mengisi parameter kueri saya daripada String yang digabungkan tetapi ada kita. Ini hanya kasus membangun URL dengan parameter yang benar. Jika Anda meneruskannya sebagai String Spring juga akan mengurus pengodean untuk Anda.
sumber
Saya mencoba sesuatu yang serupa, dan contoh RoboSpice membantu saya mengatasinya :
sumber
RestTemplate: Bangun URI dinamis menggunakan UriComponents (variabel URI dan parameter Permintaan)
sumber
Mengonversi peta hash ke serangkaian parameter kueri:
sumber
Saya mengambil pendekatan yang berbeda, Anda mungkin setuju atau tidak, tetapi saya ingin mengontrol dari file .properties daripada mengkompilasi kode Java
Di dalam file application.properties
endpoint.url = https: // yourHost / resource? requestParam1 = {0} & requestParam2 = {1}
Kode Java ada di sini, Anda dapat menulis jika atau beralih kondisi untuk mengetahui apakah URL titik akhir dalam file .properties memiliki @PathVariable (berisi {}) atau @RequestParam (yourURL? Key = value) dll ... lalu gunakan metode yang sesuai .. ... dengan cara itu dinamis dan tidak perlu mengubah kode di one stop shop di masa depan ...
Saya mencoba memberikan lebih banyak ide daripada kode aktual di sini ... coba tulis metode generik masing-masing untuk @RequestParam, dan @PathVariable dll ... lalu panggil yang sesuai ketika dibutuhkan
sumber
Di Spring Web 4.3.6 saya juga melihat
Itu berarti Anda tidak perlu membuat peta yang jelek
Jadi, jika Anda memiliki url ini
Anda bisa melakukannya
atau
sumber
sumber
Jika Anda melewati param non-parametrized untuk RestTemplate, Anda akan memiliki satu Metrik untuk semua orang satu URL berbeda yang Anda lewati, dengan mempertimbangkan parameter. Anda ingin menggunakan url yang parametrized:
dari pada
Kasus kedua adalah apa yang Anda dapatkan dengan menggunakan kelas UriComponentsBuilder.
Salah satu cara untuk menerapkan perilaku pertama adalah sebagai berikut:
sumber
Jika url Anda
http://localhost:8080/context path?msisdn={msisdn}&email={email}
kemudian
bekerja untuk metode pertukaran resttemplate seperti yang dijelaskan oleh Anda
sumber