# API Nutzung SERVLET



## newbie2009 (9. Dez 2010)

hey leute bin neu auf dem Gebiet von Servlets,

habe schon gegooglet aber irgendwie fehlen mir wohl die passenden Schlagwörter.

Also ich möchte eine Anbindung an eine API, ich weiß bei AJAX kann man ja mit dem xmlhttpRequest, bestimmte Ressourcen anfordern, aber wie funktioniert das im Servlet???
geht das auch über die request bzw responste objekte?

ich möchte dem servlet, eine url übergeben, der dann von dieser seite eine xml bekommt und diese dann parsen.


vielen Dank 

im Voraus


----------



## SlaterB (9. Dez 2010)

das Servlet soll selber Informationen von woanders laden?
tja das geht wohl so wie jeder normale Java-Client, URLConnection oder HttpClient,

die URL kannst du an das Servlet genau so übergeben wie jede andere Info auch, innerhalb des Server-Programms per Java-Methoden-Parameter oder Attribut in Request/Session,
von außen über HTTP einer der Parameter der Anfrage wie alle anderen


----------



## newbie2009 (9. Dez 2010)

ah ok, aber sobald ich ein neues httpClient objekt erzeuge,
kommt die MEldung "the constructor is not visible" , habe schon die modifier auf public etc gestellt,
aber funzt nicht,

woran könnte es liegen ?


----------



## SlaterB (9. Dez 2010)

ich selber habe es noch nie benutzt, das ist sicher ein größeres Thema für sich, 
Tutorials wie
HttpClient - HttpClient Tutorial
angeschaut?

auch Forumsuche führt zu Beispielen wie
http://www.java-forum.org/netzwerkprogrammierung/108198-php-echo-java-auswerten.html


----------



## newbie2009 (9. Dez 2010)

ja das Vorgehen an sich ist mir schon klar  


das Tutorial habe ich schon gelesen ^^ 
aber bei mir klappt nicht mal das erstellen des Objekts.

HttpClient client = new HttpClient();

sprich hier kommt schon die Meldung "The Construcor HttpClient is not Visible".

mfg :rtfm:


----------



## SlaterB (9. Dez 2010)

tja, ich kann dazu nicht direkt weiterhelfen, diesen exakte Fehlermeldungs kennt nichmal google,

wie sieht der Import aus, ist das auch die richtige API oder nicht eine völlig andere Klasse?


----------



## ARadauer (9. Dez 2010)

newbie2009 hat gesagt.:


> ...HttpClient client = new HttpClient();
> 
> sprich hier kommt schon die Meldung "The Construcor HttpClient is not Visible".
> 
> mfg :rtfm:



echt? 
HttpClient - HttpClient Tutorial 
beschreibt es genau so...



> Also ich möchte eine Anbindung an eine API, ich weiß bei AJAX kann man ja mit dem xmlhttpRequest, bestimmte Ressourcen anfordern, aber wie funktioniert das im Servlet???


du brauchst keine xmlhttpRequest du bist bereits am server...

Ich würd auch gar keinen HttpClient nehmen... mit BufferedReader von einer Url lesen..


```
URLConnection con = new URL(urlString).openConnection();
         con.connect();
         BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
         String line = null;
         while ((line = reader.readLine()) != null) {
            System.out.println(line);
//hier jetzt was mit dem content machen...
         }
```
bzw wenn die Resource auf deinem eigenen Server liegt... einfach von einem File lesen...


----------



## newbie2009 (9. Dez 2010)

ok hört sich gut an  

ich versuche ma einen Request zu senden, kann man denn die XML Datei ohne zusätzliche Libraries parsen?


----------



## SlaterB (9. Dez 2010)

an sich ist XML nur Text, also Strings, kannst du interpretieren wie du willst,
manche höhere Parser sind in der API (SAX, DOM), andere extern


----------



## newbie2009 (9. Dez 2010)

```
import java.util.*;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Reader;
import java.net.*;
import java.io.BufferedReader;
import org.xml.sax.*;
import org.xml.sax.helpers.XMLReaderFactory;




public class anfrage{


BufferedReader rd  = null;
StringBuilder sb = null;
String line = null;

  public static void main( String args[] ) throws Exception
  {
	  
 
	  
    URL url = new URL( "http://api.qype.com/v1/places/?show=berlin&consumer_key=xxxxxxxx" );
    HttpURLConnection conn = (HttpURLConnection)url.openConnection();
    conn.setRequestMethod("GET");
    conn.setAllowUserInteraction(false); // no user interact [like pop up]
    conn.setDoInput(true); // will empfangen 
    conn.setRequestProperty( "Content-type", "text/xml" );
    
    
    java.io.InputStream in = conn.getInputStream();
    System.out.print(in.read());
    
    
    
    
    
    try {
        XMLReader parser = XMLReaderFactory.createXMLReader();
        Reader reader = new InputStreamReader(in,"UTF-8");
        
        InputSource is = new InputSource(reader);
        is.setEncoding("UTF-8");
         
        parser.parse(is);
      
      }
      catch (SAXException e) {
      
      }

    
    
    conn.disconnect();

  
    
    

    
    
   


  }
}
```

Soweit müsste es funktionieren, jedoch besteht hier das problem, dass [Fatal Error] :1:1: Content is not allowed in prolog."
Soll angeblich daran liegen, dass das xml keinen richtigen header hat, ist auch so  
aber wie kann ich das problem nun lösen ..


----------



## SlaterB (9. Dez 2010)

mit BufferedReader Datei textuell analysieren oder fehlende Zeilen zur gehobenen Verarbeitung ergänzen


----------



## newbie2009 (9. Dez 2010)

ich habe jetzt noch einen String angehangen aber irgendwie geht es trotzdem nicht

```
String header ="<?xml version=\"1.0\" encoding=\"utf-8\"?>";


 try {
        XMLReader parser = XMLReaderFactory.createXMLReader();
        Reader reader = new InputStreamReader(in,"UTF-8");
        
        InputSource is = new InputSource(reader);
        is.setEncoding("UTF-8");
         
        parser.parse(header+is);
```


----------



## SlaterB (9. Dez 2010)

so gehts auch nicht gerade, so baust du einen String zusammen a la
[c]<?xml version=\"1.0\" encoding=\"utf-8\"?>InputStream@54566[/c]
und der XMLReader such dann eine Datei mit diesem Namen..

am überschaulichsten ist wohl, die XML-Datei auf der Festplatte zwischenzuspeichern, mit FileWriter usw.,
dabei erst die eine Zeile schreiben, dann die Zeilen aus dem Stream, von dort mit BufferedReader zeilenweise gelesen,
beim Schreiben die Zeilenumbrüche nicht vergessen
wenn die Datei fertig ist, diese dann wieder einlesen und als Stream übergeben,

na immer noch schwierige Sache, vielleicht hilft Code a la 
Java: File I/O - Text Files


----------

