2017-02-15 3 views
2

Ich schreibe eine Funktion, die mit HttpGet und HttpPost verwendet wird. Es ist so etwas wie das:Java 8 HttpClient 4.5 HttpGet und HttpPost in einer Funktion

private void initialize(HttpRequestBase method) 
{ 
    if(method == new HttpPost()) 
    { 
    String body = "body"; 
     HttpEntity entity = new ByteArrayEntity(body.getBytes("UTF-8")); 
     method.setEntity(entity); 
} 

Problem ist, dass nicht Httprequestbase .setEntity unterstützt. Wie kann ich eine Funktion schreiben, die HttpGet und HttpPost ohne solche Probleme unterstützt?

+1

Sie wissen, dass Ihre 'if' Bedingung * niemals * wahr sein wird, nicht wahr? Jede vorhandene Objektreferenz, die mit einem neuen Objekt verglichen wird, gibt "false" zurück. – RealSkeptic

+0

Oh, du hast Recht. Irgendeine Annäherung? –

+0

'if (Methodeninstanz von HttpPost)' –

Antwort

2

Die Möglichkeit, dieses Problem zu umgehen, besteht darin, den Typ mit instanceof zu überprüfen und einen Cast zu verwenden. Gefällt mir:

private void initialize(HttpRequestBase method) 
{ 
    if(method instanceof HttpPost) 
    { 
     String body = "body"; 
     HttpEntity entity = new ByteArrayEntity(body.getBytes("UTF-8")); 
     ((HttpPost) method).setEntity(entity); 
    } 
} 

Aber immer wenn Sie eine Besetzung verwenden, sollten Sie bedenken, dass es eine elegantere Lösung geben kann. In diesem Fall würde ich argumentieren, dass eine elegantere Lösung wäre, Methodenüberladung zu verwenden und eine spezifische Methode für HttpPost Instanzen zu haben.

private void initialize(HttpPost method) 
{ 
    String body = "body"; 
    HttpEntity entity = new ByteArrayEntity(body.getBytes("UTF-8")); 
    method.setEntity(entity); 
} 

Natürlich würde dies bedeuten, eine separate Methode für HttpGet benötigen würde (und alle anderen Unterklassen von HttpRequestBase Sie unterstützen möchten). Jeder gemeinsame Code, der zwischen GET und POST geteilt wird, sollte in kleinere Methoden extrahiert werden, die von beiden initialize() Methoden aufgerufen werden.

private void initialize(HttpGet method) 
{ 
    // ... 
} 

dies natürlich, könnten Sie Niederlagen den ganzen Sinn zu versuchen, argumentieren sowohl einen Handler für GET und POST zu erstellen. Und du hättest recht. Aber Sie sollten dann die gesamte Übung des Versuchs, eine Methode zu erstellen, die beide behandelt, in Frage stellen. Vielleicht ist das eleganteste Design, sie getrennt zu behandeln. Genau das haben die Autoren des von Ihnen verwendeten Frameworks getan.

+0

Erstellen von zwei getrennten Methoden - das war etwas, was ich vermeiden wollte, weil 90% des Codes in diesen Methoden die gleichen wären –

+1

Verkapseln gemeinsame Funktionalität in kleineren Methoden, die von beiden Initialisierer aufgerufen werden. – Asaph

+1

Sie könnten Ihre Antwort mit diesem Kommentar aktualisieren. –

Verwandte Themen