SerwerSms - api post call

0

Hej,

próbuję wysłać sms z użyciem tego serwisu https://dev.serwersms.pl/https-api-v2/wprowadzenie

stworzyłem takiego Beana aby nie tworzyć ciągle nowego WebClienta

@Configuration
public class WebClientConfiguration {

    @Bean
    public WebClient.Builder getWebClientBuilder() {
        return WebClient.builder();
    }
}

na razie taki zaczątek serwisu

@Service
public class SmsService {

    @Autowired
    private WebClient.Builder webClientBuilder;

    private static String URI = "https://api2.serwersms.pl/messages/send_sms";


    public SmsResponseDto send(String phone) {

        SmsGateway smsGateway = new SmsGateway();
        smsGateway.setLogin("mojUser");
        smsGateway.setHaslo("mojeHaslo");
        smsGateway.setNadawca("nadawcaTekst");
        smsGateway.setNumer(phone);
        smsGateway.setWiadomosc("this is the test message");

        return webClientBuilder.build()
                .post()
                .uri(URI)
                .contentType(MediaType.APPLICATION_JSON)
                .body(BodyInserters.fromValue(smsGateway))
                .retrieve()
                .bodyToMono(SmsResponseDto.class)
                .retryWhen(Retry.fixedDelay(2, Duration.ofMillis(100)))
                .block();
    }

a tak wygląda smsGateway

@Data
public class SmsGateway {
    @JsonProperty
    String login;

    @JsonProperty
    String haslo;

    @JsonProperty
    String nadawca;

    @JsonProperty
    String wiadomosc;

    @JsonProperty
    String numer;
}

skrypt działa ok 3 sekund. Brak błędów w konsoli. Brak sms.
Chcialbym użyć WebClient - na internetach doczytałem, że restTemplate zniknie i rekomendują WebClient.

1
john_doe napisał(a):

stworzyłem takiego Beana aby nie tworzyć ciągle nowego WebClienta

@Configuration
public class WebClientConfiguration {

    @Bean
    public WebClient.Builder getWebClientBuilder() {
        return WebClient.builder();
    }
}

Przecież stwórzyłeś beana z builderem, więc i tak przy każdym requeście tworzysz nowego clienta.

john_doe napisał(a):
        return webClientBuilder.build()
                .post()
                .uri(URI)
                .contentType(MediaType.APPLICATION_JSON)
                .body(BodyInserters.fromValue(smsGateway))
                .retrieve()
                .bodyToMono(SmsResponseDto.class)
                .retryWhen(Retry.fixedDelay(2, Duration.ofMillis(100)))
                .block();
    }

Nie powinieneś w ogóle korzystać z block, zwracasz Mono i przekazujesz do controllera.

0

A po co ty rzeźbisz sobie sam, ręcznie tego klienta jak na pierwsze stronie dają link do oficjalnego klienta: https://github.com/SerwerSMSpl/serwersms-java-api
Są tam też przykłady z działającymi kawałkami kodu. Ja bym zaczął od użycia tego domyślego klienta.

Dalej dla dobra architektury możesz sobie zrobić jakąś fasadę tak żeby się dało potem łatwo zmienić dostawcę usługi SMS, ale to jak już będziesz miał działający kod + w zależności od wymagań sytuacji.

0

@0xmarcin: wiem, że jest gotowiec. Jednak słabo uśmiecha mi się pakować w projekt tyle plików dotyczących tego klienta. Chodzi o zwykły post pod wskazany url.

Taki kawałek działa

    public SmsResponseDto send() {

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);

        Map<String, String> map = new HashMap<String, String>();
        map.put("username", "user");
        map.put("password", "pass");
        map.put("phone", "+48555666555");
        map.put("text", "test from Spring Boot");
        map.put("sender", "John-Doe");

        return webClientBuilder.build()
                .post()
                .uri(URI)
                .accept(MediaType.APPLICATION_JSON)
                .contentType(MediaType.APPLICATION_JSON)
                .body(BodyInserters.fromValue(map))
                .retrieve()
                .bodyToMono(SmsResponseDto.class)
                .retryWhen(Retry.fixedDelay(2, Duration.ofMillis(100)))
                .block();
    }

gdzie najlepiej trzymać dane user, pass ?

0

Nadal za każdym wywołaniem metody tworzysz nowego web clienta. Stwórz bean z webclientem, a nie builderem.

Jeśli chodzi o trzymanie credentiali to powinieneś wczytywać je ze zmiennych środowiskowych, najlepiej przez jakieś pliki konfiguracyjne. https://blog.indrek.io/articles/using-environment-variables-with-spring-boot/

1 użytkowników online, w tym zalogowanych: 0, gości: 1