SerwerSms - api post call

SerwerSms - api post call
JD
  • Rejestracja:około 19 lat
  • Ostatnio:dzień
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

Kopiuj
@Configuration
public class WebClientConfiguration {

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

na razie taki zaczątek serwisu

Kopiuj
@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

Kopiuj
@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.

crejk
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 12 godzin
  • Postów:46
1
john_doe napisał(a):

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

Kopiuj
@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):
Kopiuj
        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.

edytowany 6x, ostatnio: crejk
JD
block sprawia, że call jest synchroniczny
crejk
@john_doe: po co w ogóle używasz reaktora jak chcesz to synchronicznie zrobić?
JD
na ten moment chce by zadziałało, a potem refaktorować najwyżej
99xmarcin
  • Rejestracja:około 5 lat
  • Ostatnio:6 miesięcy
  • Postów:2420
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.


Holy sh*t, with every month serenityos.org gets better & better...
JD
  • Rejestracja:około 19 lat
  • Ostatnio:dzień
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

Kopiuj
    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 ?

edytowany 4x, ostatnio: john_doe
99xmarcin
Faktycznie nie opublikowali paczki MVN'a (dadałem im issue: https://github.com/SerwerSMSpl/serwersms-java-api/issues/3). Chyba jedyna zaleta tego klienta w obecnej postaci to JavaDoc'i.
VD
  • Rejestracja:ponad 10 lat
  • Ostatnio:10 miesięcy
  • Postów:72
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/

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.