Helpex - Trao đổi & giúp đỡ Đăng nhập

Spring RestTemplate GET với các tham số

Võ Tùng Quang
· 14:21 28/11/2011
hôm qua

Tôi phải thực hiện một RESTcuộc gọi bao gồm các tiêu đề tùy chỉnh và các tham số truy vấn. Tôi đặt của tôi HttpEntitychỉ với tiêu đề (không có nội dung) và tôi sử dụng RestTemplate.exchange()phương pháp như sau:

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);

Điều này không thành công ở cuối máy khách với việc dispatcher servletkhông thể giải quyết yêu cầu tới trình xử lý. Sau khi gỡ lỗi nó, có vẻ như các tham số yêu cầu không được gửi.

Khi tôi thực hiện trao đổi với một POSTcơ quan yêu cầu và không có tham số truy vấn, nó hoạt động tốt.

Có ai có ý tưởng nào?

313 hữu ích 0 bình luận 504k xem chia sẻ
Huỳnh Bảo Chi
· 19:29 21/08/2014
19:29:13 21/08/2014

Để dễ dàng thao tác với URL / path / params / v.v., bạn có thể sử dụng lớp UriComponentsBuilder của Spring . Nó gọn gàng hơn so với việc nối các chuỗi theo cách thủ công và nó sẽ chăm sóc mã hóa URL cho bạn:

HttpHeaders headers = new HttpHeaders();
headers.set(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE);

UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
        .queryParam("msisdn", msisdn)
        .queryParam("email", email)
        .queryParam("clientVersion", clientVersion)
        .queryParam("clientType", clientType)
        .queryParam("issuerName", issuerName)
        .queryParam("applicationName", applicationName);

HttpEntity<?> entity = new HttpEntity<>(headers);

HttpEntity<String> response = restTemplate.exchange(
        builder.toUriString(), 
        HttpMethod.GET, 
        entity, 
        String.class);
571 hữu ích 5 bình luận chia sẻ
Hoàng Trung Đức
· 18:18 21/05/2013
18:18:40 21/05/2013

UriVariables cũng được mở rộng trong chuỗi truy vấn. Ví dụ: lệnh gọi sau sẽ mở rộng giá trị cho cả tài khoản và tên:

restTemplate.exchange("http://my-rest-url.org/rest/account/{account}?name={name}",
    HttpMethod.GET,
    httpEntity,
    clazz,
    "my-account",
    "my-name"
);

vì vậy url yêu cầu thực tế sẽ là

http://my-rest-url.org/rest/account/my-account?name=my-name

Xem HierarchicalUriComponents.expandInternal (UriTemplateVariables) để biết thêm chi tiết. Phiên bản của Spring là 3.1.3.

215 hữu ích 5 bình luận chia sẻ
Đặng Hương Trà
· 17:48 29/04/2018
17:48:55 29/04/2018

Ít nhất là từ mùa xuân 3, thay vì sử dụng UriComponentsBuilderđể xây dựng các URL (đó là một chút dài dòng), nhiều trong những RestTemplatephương pháp chấp nhận giữ chỗ trong đường dẫn cho các thông số (không chỉ exchange).

Từ tài liệu:

Nhiều RestTemplatephương thức chấp nhận một mẫu URI và các biến mẫu URI, dưới dạng Stringvararg hoặc dưới dạng Map<String,String>.

Ví dụ với Stringvararg:

restTemplate.getForObject(
   "http://example.com/hotels/{hotel}/rooms/{room}", String.class, "42", "21");

Hoặc với một Map<String, String>:

Map<String, String> vars = new HashMap<>();
vars.put("hotel", "42");
vars.put("room", "21");

restTemplate.getForObject("http://example.com/hotels/{hotel}/rooms/{room}", 
    String.class, vars);

Tham khảo: https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#rest-resttemplate-uri

Nếu bạn nhìn vào javadoc cho RestTemplatevà tìm kiếm cho "URI Template", bạn có thể xem những phương pháp bạn có thể sử dụng placeholders với.

49 hữu ích 0 bình luận chia sẻ
Vũ Khắc Thành
· 15:07 29/11/2011
15:07:52 29/11/2011

OK, vì vậy tôi là một tên ngốc và tôi đang nhầm lẫn các tham số truy vấn với tham số url. Tôi đã hy vọng sẽ có một cách tốt hơn để điền các tham số truy vấn của tôi thay vì một Chuỗi nối xấu xí nhưng chúng tôi đã có. Nó chỉ đơn giản là một trường hợp xây dựng URL với các tham số chính xác. Nếu bạn chuyển nó dưới dạng String Spring cũng sẽ chăm sóc mã hóa cho bạn.

32 hữu ích 4 bình luận chia sẻ
Tạ Kim Loan
· 18:17 30/01/2019
18:17:29 30/01/2019
    String uri = http://my-rest-url.org/rest/account/{account};

    Map<String, String> uriParam = new HashMap<>();
    uriParam.put("account", "my_account");

    UriComponents builder = UriComponentsBuilder.fromHttpUrl(uri)
                .queryParam("pageSize","2")
                        .queryParam("page","0")
                        .queryParam("name","my_name").build();

    HttpEntity<String> requestEntity = new HttpEntity<>(null, getHeaders());

    ResponseEntity<String> strResponse = restTemplate.exchange(builder.toUriString(),HttpMethod.GET, requestEntity,
                        String.class,uriParam);

    //final URL: http://my-rest-url.org/rest/account/my_account?pageSize=2&page=0&name=my_name

RestTemplate: Xây dựng URI động bằng UriComponents (biến URI và tham số Yêu cầu)

21 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ java spring rest , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm