Java-HTTP-Adapter
improve this page | report issueÜbersicht
Mit Java-Adaptern können Sie die Konnektivität zu einem Back-End-System steuern und kontrollieren. Der Entwickler ist daher dafür verantwortlich, bewährte Verfahren hinsichtlich der Leistung und anderer Implementierungsdetails anzuwenden. In diesem Lernprogramm gibt es ein Beispiel für einen Java-Adapter, der mit einem Java-HttpClient
eine Verbindung zu einem RSS-Feed herstellt.
Voraussetzung: Arbeiten Sie zuerst das Lernprogramm Java-Adapter durch.
Wichtiger Hinweis: Wenn Sie in Ihrer Adapterimplementierung statische Referenzen auf Klassen von
javax.ws.rs.*
oderjavax.servlet.*
verwenden, müssen Sie RuntimeDelegate mit einer der folgenden Optionen konfigurieren:
- Legen Sie in Liberty in der Datei
jvm.options
-Djavax.ws.rs.ext.RuntimeDelegate=org.apache.cxf.jaxrs.impl.RuntimeDelegateImpl
fest. ODER - Legen Sie Sie die Systemeigenschaft oder angepasste JVM-Eigenschaft
javax.ws.rs.ext.RuntimeDelegate=org.apache.cxf.jaxrs.impl.RuntimeDelegateImpl
fest.
Adapter initialisieren
Im bereitgestellten Beispieladapter wird die Klasse JavaHTTPApplication
verwendet,
um MFPJAXRSApplication
zu erweitern. Dies ist ein bewährtes Verfahren zum Auslösen einer für Ihre Anwendung
erforderlichen Initialisierung.
@Override
protected void init() throws Exception {
JavaHTTPResource.init();
logger.info("Adapter initialized!");
}
Adapterressourcenklasse implementieren
Die Adapterressourcenklasse behandelt Anforderungen an den Server.
Im bereitgestellten Beispieladapter hat die Klasse den Namen JavaHTTPResource
.
@Path("/")
public class JavaHTTPResource {
}
@Path("/")
bedeutet, dass die Ressourcen unter der URL http(s)://host:port/ProjectName/adapters/AdapterName/
verfügbar sind.
HTTP-Client
private static CloseableHttpClient client;
private static HttpHost host;
public static void init() {
client = HttpClientBuilder.create().build();
host = new HttpHost("mobilefirstplatform.ibmcloud.com");
}
Da jedes Mal, wenn Ihre Ressource angefordert wird, eine neue Instanz von JavaHTTPResource
erstellt wird,
ist es wichtig, Objekte mit Einfluss auf die Leistung wiederzuverwenden. In unserem Beispiel ist der HTTP-Client ein
statisches (static
) Objekt, der in einer statischen Methode init()
initialisiert wird, die
wie oben beschrieben von der Methode init()
von JavaHTTPApplication
aufgerufen wird.
Prozedurressource
@GET
@Produces("application/json")
public void get(@Context HttpServletResponse response, @QueryParam("tag") String tag)
throws IOException, IllegalStateException, SAXException {
if(tag!=null && !tag.isEmpty()){
execute(new HttpGet("/blog/atom/"+ tag +".xml"), response);
}
else{
execute(new HttpGet("/feed.xml"), response);
}
}
Der Beispieladapter macht nur eine Ressourcen-URL zugänglich, über die Sie den RSS-Feed vom Back-End-Service abrufen können.
@GET
bedeutet, dass diese Prozedur nur aufHTTP GET
-Anforderungen reagiert.@Produces("application/json")
gibt den Inhaltstyp der zurückzusendenden Antwort an. In unserem Beispiel wird die Antwort zur Vereinfachung auf der Clientseite alsJSON
-Objekt gesendet.@Context HttpServletResponse response
wird verwendet, um den Ausgabedatenstrom der Antwort zu schreiben, und ermöglicht eine größere Detailgenauigkeit als die Rückgabe einer einfahcen Zeichenfolge.- Der Zeichenfolgetag
@QueryParam("tag")
ermöglicht der Prozedur, einen Parameter zu empfangen. Die OptionQueryParam
gibt an, dass der Parameter in der Abfrage übergeben werden muss (/JavaHTTP/?tag=MobileFirst_Platform
). Weitere mögliche Optionen sind@PathParam
,@HeaderParam
,@CookieParam
,@FormParam
usw. throws IOException, ...
bedeutet, dass Ausnahmen zurück zum Client weitergeleitet werden. Der Client-Code ist für die Behandlung möglicher Ausnahmen zuständig, die als FehlerHTTP 500
empfangen werden. Eine andere Lösung (die in Produktionscode favorisiert werden dürfte) ist die Behandlung von Ausnahmen im Server-Java-Code. Bei dieser Lösung kann ausgehend vom konkreten Fehler entschieden werden, was an den Client gesendet werden soll.execute(new HttpGet("/feed.xml"), response)
bedeutet, dass die eigentliche HTTP-Anforderung an den Back-End-Service von einer anderen, später definierten Methode bearbeitet wird.
Der mit execute
abgerufene Build und Pfad sowie die abgerufene RSS-Datei hängen davon ab, ob Sie einen Parameter tag
übergeben.
execute()
public void execute(HttpUriRequest req, HttpServletResponse resultResponse)
throws IOException,
IllegalStateException, SAXException {
HttpResponse RSSResponse = client.execute(host, req);
ServletOutputStream os = resultResponse.getOutputStream();
if (RSSResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
resultResponse.addHeader("Content-Type", "application/json");
String json = XML.toJson(RSSResponse.getEntity().getContent());
os.write(json.getBytes(Charset.forName("UTF-8")));
}else{
resultResponse.setStatus(RSSResponse.getStatusLine().getStatusCode());
RSSResponse.getEntity().getContent().close();
os.write(RSSResponse.getStatusLine().getReasonPhrase().getBytes());
}
os.flush();
os.close();
}
HttpResponse RSSResponse = client.execute(host, req)
: Der statische HTTP-Client wird verwendet, um die HTTP-Anforderung auszuführen und die Antwort zu speichern.ServletOutputStream os = resultResponse.getOutputStream()
: Dies ist der Ausgabedatenstrom zum Schreiben einer Antwort an den Client.resultResponse.addHeader("Content-Type", "application/json")
: Die Antwort wird, wie bereits erwähnt, als JSON gesendet.String json = XML.toJson(RSSResponse.getEntity().getContent())
: Für die Konvertierung von XML-RSS in eine JSON-Zeichenfolge wirdorg.apache.wink.json4j.utils.XML
verwendet.os.write(json.getBytes(Charset.forName("UTF-8")))
: Dies resultierende JSON-Zeichenfolge wird in den Ausgabedatenstrom geschrieben.
Für den Ausgabedatenstrom wird eine Flush-Operation (flush
). Anschließend wird der Datenstrom geschlossen (close
).
Wenn die Antwort (RSSResponse
) nicht 200 OK
lautet, werden stattdessen der Statuscode und die Ursache in die Antwort geschrieben.
Beispieladapter
Klicken Sie hier, um das Maven-Adapterprojekt herunterzuladen.
Zum Maven-Adapterprojekt gehört der oben beschriebene JavaHTTP-Adapter.
Verwendung des Beispiels
- Verwenden Sie Maven, die MobileFirst CLI oder eine IDE Ihrer Wahl, um den Java-HTTP-Adapter zu erstellen und zu implementieren.
- Informationen zum Testen oder Debuggen eines Adapters enthält das Lernprogramm Adapter testen und debuggen.
Inclusive terminology note: The Mobile First Platform team is making changes to support the IBM® initiative to replace racially biased and other discriminatory language in our code and content with more inclusive language. While IBM values the use of inclusive language, terms that are outside of IBM's direct influence are sometimes required for the sake of maintaining user understanding. As other industry leaders join IBM in embracing the use of inclusive language, IBM will continue to update the documentation to reflect those changes.