# Java REST Client + Json



## swinkel (22. Feb 2018)

Hallo, 
ich wäre sehr dankbar über einen Tip, in der folgenden Angelegenheit. Ich möchte mittels Java (EE7 und JDK 8) folgenden curl Befehl nachbauen:

curl -X POST --header "Content-Type: application/json" --header "Accept: application/json" --header "Authorization: Basic APIKEYjsjsj "{
    \"customer_id\": 180791226,
    \"items\": [
       { \"number\": \"2\", \"quantity\": 2, \"single_price_net\": 1680.6723, \"vat_percent\": 19 }
     ], } " "https://urlxkxkx"

Es funktioniert, bis auf das Json-Array "items". Bis jetzt habe ich folgendes:
2 Pojo-Klassen für die Elemente:


```
public class Bill implements Serializable {

private int customer_id;
private List <Items> items;
.... getter und setter
}

public class Items implements Serializable {
private int number;
private int quantity;
private double single_price_net;
private int vat_percent;

    public Items(int number, int quantity, double
    single_price_net) {
        this.number = number;
        this.quantity = quantity;
        this.single_price_net = single_price_net;
        this.vat_percent = 19;
    }
.... getter und setter
```

Zum Testen dann folgendes:


```
Bill bill = new Bill();
List<Items> order = new ArrayList();
order.add(new Items(2, 1, 16));
bill.setItems(order);
bill.setCustomer_id(180791226);

Client client = ClientBuilder.newClient();
Response response = client
                .target("https://url....yxy")
                .queryParam("q", "someQuery")
                .request("application/json")           
                .header("Content-Type", "application/json")      
                .header("authorization", "Basic APIKEY")
                .post(Entity.json(bill));
```

Auf die Art und Weise kann ich die customer_id zum Server senden, aber nicht die Inhalte innerhalb des Arrays. Hat jemand einen Tip für mich?

Viele Grüße

Swinkel


----------



## krgewb (22. Feb 2018)

Funktioniert das mit der customer_id? Woher weiß der Server, dass das die customer_id ist?


----------



## swinkel (22. Feb 2018)

Ja, nur customer_id funktioniert. Die Bezeichnung habe ich der API-Doku vom Server entnommen. Wenn ich die Elemente im Array dem POST-Befehl mitgebe, funktioniert es nicht und im Log von der Clientseite steht:

org.glassfish.jersey.message.internal.MessageBodyProviderNotFoundException: MessageBodyWriter not found for media type=application/json, type=class net.netzfabrik.model.Bill, genericType=class net.netzfabrik.model.Bill.

Noch ne Idee?


----------



## mrBrown (22. Feb 2018)

krgewb hat gesagt.:


> Funktioniert das mit der customer_id? Woher weiß der Server, dass das die customer_id ist?


Weil das Feld customer_id heißt?


----------



## mrBrown (22. Feb 2018)

swinkel hat gesagt.:


> Noch ne Idee?



Nutzt du denn irgendeine JSON-Lib? Da scheint der passende Mapper zu fehlen...

(BTW: du kannst für die Variablen-Namen die Standard-Namens-Konventionen nutzen und die passenden JSON-Benennungen über Annotation setzen)


----------



## swinkel (22. Feb 2018)

Hi vielen Dank für den Tip mit den Annotations und Variablennamen. Das ist gut. Das noch etwas fehlen könnte, hab ich mir auch schon gedacht und gegoogelt was man braucht. Ehrlich gesagt, steige ich bei den vielen Möglichkeiten nicht mehr durch. Da der POST ohne Array funktioniert, war meine Hoffnung, dass vielleicht mit JEE7 und JDK 8 doch nichts fehlt .


----------



## mrBrown (22. Feb 2018)

*Vermutlich* fehlt jersey-media-json-jackson

Wie sieht denn der Request ohne Array aus?


----------



## swinkel (22. Feb 2018)

jersey-media-json-jackson hat bis jetzt nichts verändert, muss aber noch gucken, ob ich da vielleicht irgendwas ändern muss, damit das angewendet wird. Sorry, bin Anfänger .
Bei dem Request ohne Array, bestand das Objekt nur aus der customer_id, sonst war alles gleich. Ich teste mal weiter.


----------



## swinkel (26. Feb 2018)

Jetzt funktioniert es. Jackson war der richtige Tip. Ich habe als Lib "jackson-databind.jar" hinzugefügt. Und dann wie folgt das Json erstellt:
(bill = objekt)


```
ObjectMapper mapper = new ObjectMapper();
String serialized = mapper.writeValueAsString(bill);
Client client = ClientBuilder.newClient();
Response response = client
                .target("https://api.url.......")
                .queryParam("q", "someQuery")
                .request("application/json")
                .header("authorization", "Basic jsjsjjsjAPI-Key")
                .post(Entity.json(serialized));
```

Besten Dank nochmal und eine schöne Woche.


----------

