# Codierung bei der Anbindung an eine REST API



## ballibum (6. Sep 2018)

Hallo Forums-Experten,

ich habe ein Java-Programm geschrieben welches eine REST-API ansteuern soll. In den meisten Fällen klappt das auch prima, nur nicht sobald Sonderzeichen auftauchen. Das heißt ich generiere mir mit Java ein JSON und schicke das an die andere Software. Wenn ich das JSON mit JAVA schicke blockt die Zielsoftware in einigen Fällen das Objekt, schicke ich selbes Objekt über Postman (vorher ein einfach System.out.println()json.toString()), dann klappt es. Mein Zielprogramm, welches in PHP geschrieben ist gibt mir folgende Fehlermeldung aus:



> Malformed UTF-8 characters, possibly incorrectly encoded



Mit folgendem Programmcode, schicke ich das JSON-Objekt ab:

```
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
            String url = (String) this.props.get("drupal_baseURL") + (String) this.props.get("drupal_post");
            HttpPost request = new HttpPost(url);
            StringEntity params = new StringEntity(json.toString());
            request.addHeader("Content-Type", "application/json; charset=UTF-8");
            request.addHeader("Accept", "application/json");
            request.addHeader("X-CSRF-Token", this.sessionToken);
            String encoding = Base64.getEncoder().encodeToString((this.props.get("drupal_user") + ":" + this.props.get("drupal_password")).getBytes());
            String authHeader = "Basic " + encoding;
            request.addHeader("Authorization", authHeader);
            request.setEntity(params);
           
            HttpResponse response = httpClient.execute(request);
            int code = response.getStatusLine().getStatusCode();
            System.out.println("Insert: " + code);

        } catch (Exception ex) {
            System.out.println(ex);
            System.out.println("MIST Insert");
        }
```

Habt ihr eine Idee, wie ich diesen Fehler genauer einschränke oder gar beheben kann?

besten Gruß
Balli


----------



## Flown (7. Sep 2018)

Wenn du das hier mal ansiehst: https://docs.oracle.com/javase/10/docs/api/java/util/Base64.Encoder.html#encodeToString(byte[])
wirst du sehen, das der encodeToString das falsche macht, wenn du UTF-8 haben möchtest.


----------



## ballibum (7. Sep 2018)

Hi, ich habe die Authentifizierung einmal deaktiviert und kann nur sagen, dass der Fehler weiterhin besteht. Wenn ich bei den params (request.setEntity(params) im Vorfeld alle Sonderzeichen entferne, dann klappt der Spaß wunderbar. Das ist natürlich nicht sind und Zweck der Geschichte. Letztendlich möchte ich eigentlich nur, dass auch die Sonderzeichen beim Zielprogramm ankommen.
Eigenartig ist eben, dass die Ausgabe von json.toString() über POSTMAN super funktioniert.


Wenn ich mir 
 System.out.println(request.getEntity());
ausgeben lasse, dann erhalte ich eigenartigerweise:
[Content-Type: text/plain; charset=ISO-8859-1,Content-Length: 330,Chunked: false]

obwohl ich im Header application/json; UTF-8 angegeben habe.


----------



## ballibum (7. Sep 2018)

Die Lösung scheint folgendes zu sein:


```
StringEntity params = new StringEntity(json.toString(), "application/json", "UTF-8");
```

Jetzt wird das new StringEntity in meiner Netbeans -Umgebung nur durchgestrichen angezeigt.


----------

