Utworzenie Web Service Client

0

Witam,

mam problem. Postawiono przede mną zadanie zrobienia zadania o treści

Przygotowanie aplikacji, która da użytkownikowi dostęp do zasobu REST zwracającego podstawowe dane o podanym kraju (nazwa stolicy, nazwa obowiązującej waluty).
Utworzony zasób ma przyjmować na wejściu nazwę kraju, dla którego użytkownik chce pobrać informacje (podaną w języku angielskim), a na wyjściu zwrócić w formie JSON dane o:

  • kodzie ISO podanego kraju
  • stolicy podanego kraju
  • walucie obowiązującej w danym kraju

Usługa pozwalająca na pobranie tych danych znajduję się pod adresem:
http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL

Na początku wydawało się proste, ale przy dalszym zagłębianiu się doszedłem do wniosku że tak nie jest.

Pytanie mam takie. Jak to ugryźć? Czy wystarczy jak zrobię tylko klienta który będzie wysyłać zapytania do tej usługi i odbierać wyniki? Jak to zrobić pomóżcie naprawdę jest to sprawa życia i śmierci.

Pozdrawiam

0

Jakbyś chciał w scali to w rapture.io byłyby to dwie linijki... see http://rapture.io/intro
W javie ratpack + jackson do XML i JSON + httpclient z ratpacka. (kilka linijek, ale trzeba klasy z mapowaniem zdefiniować)

0

@jarekr000000:
coś więcej na temat tworzenia tego w javie może jakiś poradnik polecisz?

1

@Normaidian ;] Możesz za pomocą wsdl2java w mavenie wygenerować sobie stuby dla tego wsdla a potem w kilku linijkach zrobić restowy endpoint w Spring MVC & Spring Boot który będzie pobierał dane z tego SOAPa i wystawiał przez RESTa.

0
Shalom napisał(a):

@Normaidian ;] Możesz za pomocą wsdl2java w mavenie wygenerować sobie stuby dla tego wsdla a potem w kilku linijkach zrobić restowy endpoint w Spring MVC & Spring Boot który będzie pobierał dane z tego SOAPa i wystawiał przez RESTa.

@Shalom

Mógłbyś coś więcej mi na ten temat powiedzieć. Jestem dopiero początkującym i nie za bardzo wiem jak się za to zabrać.

Pozdrawiam

1

Sorry za kod - niestety pisze z lotniska i zaraz mi samolot poleci jak nie pójde - kilka rzeczy sobie poprawisz....

package pl.setblack.fsdhfkshf;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
import javaslang.collection.List;
import javaslang.control.Option;
import javaslang.jackson.datatype.JavaslangModule;
import ratpack.http.client.HttpClient;
import ratpack.jackson.Jackson;
import ratpack.server.RatpackServer;

import java.net.URI;
import java.time.Duration;

/**
 * Created by dobry wujek  on 3/11/17.
 */
public class BeMyServerBabe {

    public static final String COUNTRY_INFO_URL = "http://www.oorsprong.org/websamples.countryinfo/CountryInfoService.wso/FullCountryInfoAllCountries/JSON";

    public static void main(final String ... args) throws Exception{
        final ObjectMapper mapper = configureJacksonMapping();

        RatpackServer.start(spec -> spec
                .registryOf(reg -> reg.add(mapper))
                .handlers(chain -> chain.get("country/:name", ctx ->{
                   Option<String> countryName = Option.of(ctx.getPathTokens().get("name"));
                    final HttpClient httpClient = HttpClient.of(rs->rs.readTimeout(Duration.ofMinutes(1)));
                    httpClient.get(URI.create(COUNTRY_INFO_URL)).map(response -> {

                       final List<CountryData> countries =  mapper
                               .readValue(
                                       response.getBody().getInputStream(),
                                       new TypeReference<List<CountryData>>(){});
                       System.out.println("got countries:"+ countries.size());
                      return  countries.filter( country -> country.sName.equals(countryName.getOrElse("unknown")))
                               .headOption();

                    }).then( countryOption ->
                            ctx
                                    .render(
                                            Jackson.json(countryOption
                                                    .getOrElseThrow(() -> new IllegalArgumentException(countryName.getOrElse("???"))))
                                    ));

                })));
    }


    private static final ObjectMapper configureJacksonMapping() {
        return  new ObjectMapper()
                .registerModule(new ParameterNamesModule())
                .registerModule(new Jdk8Module())
                .registerModule(new JavaslangModule());
    }
}
@JsonDeserialize
@JsonIgnoreProperties(ignoreUnknown = true)
class CountryData {
    public final String sName;
    public final String sISOCode;
    public final String sCurrencyISOCode;
    public final String sCapitalCity;

    @JsonCreator
    CountryData(String sName, String sISOCode, String sCurrencyISOCode, String sCapitalCity) {
        this.sName = sName;
        this.sISOCode = sISOCode;
        this.sCurrencyISOCode = sCurrencyISOCode;
        this.sCapitalCity = sCapitalCity;
    }
}

i build.gradle

group 'pl.setblack.kdfghe'
version '1.0-SNAPSHOT'

apply plugin: 'java'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}


compileJava {
    options.compilerArgs << '-parameters'
}


dependencies {
    compile group: 'io.ratpack', name: 'ratpack-core', version: '1.4.4'

    compile 'io.javaslang:javaslang:2.1.0-alpha'
    compile 'io.javaslang:javaslang-jackson:2.1.0-alpha'
    compile group: 'io.reactivex.rxjava2', name: 'rxjava', version: '2.0.5'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.8.6'
    compile group: 'com.fasterxml.jackson.module', name: 'jackson-module-parameter-names', version: '2.8.6'


    testCompile group: 'io.ratpack', name: 'ratpack-test', version: '1.4.4'

}

Ten parametr kompilatora -parameters jest bardzo ważny (uważaj w eclipse lub intellij,żeby ustawić).

http://localhost:5050/country/Poland

i świat jest twój.

0

@jarekr000000:

Dzięki za kod ale szczerze powiedziawszy nie wiem co z nim zrobić :(

1
  1. Umiesz hello world odpalić? (jak nie to poczytaj)
  2. Umiesz hello world zbudować za pomocą gradle (jak nie to poczytaj).
  3. Masz jakieś IDE?

Prościej już się nie da...

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