# Java und HTML Post von Form Daten



## AlexD1979 (30. Januar 2009)

Hallo,
Ich habe zwar viele Treffer zum Thema Java und Post gefunden, aber nicht so richtig dass, was mir weiterhilft. Konkret geht es darum, dass ich per Java einen Webservices erstellt habe, der ein Formular automatisch ausfüllt und dann abschickt. Geht dabei um eine Beitragsübermittlung an ein Fremdsystem.
In der Ursprünglichen Programmiersprache ColdFusion sah das so aus:

```
<cfhttp method="post"
	url="#urlcmd#"
	proxyServer="ww.xx.yy.zz"
	proxyPort="8080"
	username="geheim"
	password="geheim" 
	throwonerror="NO">
	<cfhttpparam type="FILE" name="userfile" file="#filepath##filename#">
					<cfhttpparam type="FORMFIELD" name="titel" value="#press_release_data.title_text#">
					<cfhttpparam type="FORMFIELD" name="sttime" value="000000">
					<cfhttpparam type="FORMFIELD" name="entime" value="000000">
					<cfhttpparam type="FORMFIELD" name="sttag" value=#NumberFormat(DatePart('d',start_date),"00")#>
					<cfhttpparam type="FORMFIELD" name="stmon" value=#NumberFormat(DatePart('m',start_date),"00")#>
					<cfhttpparam type="FORMFIELD" name="stjahr" value=#NumberFormat(DatePart('yyyy',start_date),"0000")#>
					<cfhttpparam type="FORMFIELD" name="entag" value=#NumberFormat(DatePart('d',end_date),"00")#>
					<cfhttpparam type="FORMFIELD" name="enmon" value=#NumberFormat(DatePart('m',end_date),"00")#>
					<cfhttpparam type="FORMFIELD" name="enjahr" value=#NumberFormat(DatePart('yyyy',end_date),"0000")#>
			</cfhttp>
```

In Java habe ich den Ansatz bisher:

```
String proxyIP = ConfigUtils.getString("proxyServer");
		String proxyPort = ConfigUtils.getString("ProxyPort");
		String proxyUser = ConfigUtils.getString("proxyUsername");
		String proxyPassword = ConfigUtils.getString("proxyPassword");
		String pressScriptUrl = ConfigUtils.getString("press_release_script_url");
		String dataPath = ConfigUtils.getString("document_root");

//System.setProperty( "proxySet", "false" ); 
		//System.setProperty( "proxyHost", proxyIP ); 
		//System.setProperty( "proxyPort", proxyPort );
		//System.setProperty( "http.proxyUser", proxyUser ); 
		//System.setProperty( "http.proxyPassword", proxyPassword );
```
[...]

```
String urlcmd = pressScriptUrl + "?PID="+pid+"&submit=1";
				Date start_date = article.getFieldDate("a_date_from");
				Date end_date = article.getFieldDate("a_date_to");			
				URL url = new URL( urlcmd);
				String r = new Scanner( url.openStream() ).useDelimiter( "\\Z" ).next();
```
So und da verlässt es mich jetzt.. wie bekomme ich die Felder des HTML Formulars ausgefüllt und kann eine Datei mitsenden? Ich habe das Zielformular als Grafik hier mal angefügt, damit man sich das besser vorstellen kann.


----------



## matdacat (30. Januar 2009)

> Konkret geht es darum, dass ich per Java einen Webservices erstellt habe


Du hast bereits einen erstellt? Nein, Du möchtest, oder? 

Schau Dir dazu HttpClient aus der Jakarta Commons-Library an. Auf http://www.theserverside.com/tt/articles/article.tss?l=HttpClient_FileUpload findest Du ein Beispiel dazu (such nach HttpMultiPartFileUpload.java).


----------



## AlexD1979 (2. Februar 2009)

matdacat hat gesagt.:


> Du hast bereits einen erstellt? Nein, Du möchtest, oder?
> 
> Schau Dir dazu HttpClient aus der Jakarta Commons-Library an. Auf http://www.theserverside.com/tt/articles/article.tss?l=HttpClient_FileUpload findest Du ein Beispiel dazu (such nach HttpMultiPartFileUpload.java).



Hallo,
Also irgendwie klappt das nicht, da muss eine Auth gemacht werden, aber die scheint ignoriert zu werden... bestimmt was mit Base64 oder so? Hier die Fehlermeldung:


```
java.io.IOException: Server returned HTTP response code: 401 for URL: http://www.xxxxxxxxxxx.de/login/presse_waehlen.php?PID=0&submit=1
```

Und mein Quellcode sieht so aus:

```
Properties sysProps = System.getProperties();
sysProps.put( "proxySet", "true" ); 
sysProps.put( "proxyHost", proxyIP ); 
sysProps.put( "proxyPort", proxyPort );
sysProps.put( "http.proxyUser", proxyUser ); 
sysProps.put( "http.proxyPassword", proxyPassword );
URL url = new URL(urlcmd);
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
urlConn.setDoOutput(true);
urlConn.setRequestMethod("POST");		
DataOutputStream out = new DataOutputStream( urlConn.getOutputStream() );
// Specify the content type.				    
String req = "titel=" + URLEncoder.encode("tecRacer") +
"&sttime=" + URLEncoder.encode("000000") +
"&entime=" + URLEncoder.encode("000000") +
"&sttag=" + URLEncoder.encode("01") +
"&stmon=" + URLEncoder.encode("08") +
"&stjahr=" + URLEncoder.encode("2008") +				
"&entag=" + URLEncoder.encode("01") +
"&enmon=" + URLEncoder.encode("09") +
"&enjahr=" + URLEncoder.encode("2008");	
	
out.writeBytes(req);
out.flush();
out.close();
			
//HIER WIRD DIE OBEN GEZEIGE EXEXPTION 401 GEWORFEN
DataInputStream in = new DataInputStream( urlConn.getInputStream() );
String str;
while (null != (( str = in.readLine() ))) {
System.in.read();
System.out.println(str);
}

in.close();
```


----------



## AlexD1979 (5. Februar 2009)

AlexD1979 hat gesagt.:


> Hallo,
> Also irgendwie klappt das nicht, da muss eine Auth gemacht werden, aber die scheint ignoriert zu werden... bestimmt was mit Base64 oder so? Hier die Fehlermeldung:
> 
> 
> ...




Hat noch nie einer mit Java auf die IIS Basic Authentifizierung zugegriffen?


----------



## matdacat (5. Februar 2009)

Noch mal: warum verwendet Du nicht HttpClient? Beispiel zur Basic Authentication gibts zum Beispiel hier.


----------



## AlexD1979 (9. Februar 2009)

matdacat hat gesagt.:


> Noch mal: warum verwendet Du nicht HttpClient? Beispiel zur Basic Authentication gibts zum Beispiel hier.



Auch das funktioniert nicht. BTW, die Beispiele werden im Syntax teilweise als Deprecated bezeichnet. Soviel zur Aktualität der Beispiele.

```
import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.auth.HttpAuthRealm;
import org.apache.commons.httpclient.methods.*;

@SuppressWarnings("deprecation")
public class SecureGetPageExample {
 public static void main( String[] args ) {
   
   String url = "http://xyz.dddd.tld";
   String username = "bekannt";
   String password = "geheim";
   try {
    HttpClient client = new HttpClient();
    client.getState().setCredentials(
        new HttpAuthRealm(password, password),
        new UsernamePasswordCredentials( username, password ) );
    GetMethod method = new GetMethod( url );
    method.setFollowRedirects( true );

    // Execute the GET method
    int statusCode = client.executeMethod( method );
    if( statusCode != -1 ) {
      String contents = method.getResponseBodyAsString();
      method.releaseConnection();
      System.out.println( contents );
    }
   }
   catch( Exception e ) {
    e.printStackTrace();
   }
 }
}
```

Die Antwort ist:

```
09.02.2009 22:11:19 org.apache.commons.httpclient.auth.AuthChallengeProcessor selectAuthScheme
INFO: basic authentication scheme selected
09.02.2009 22:11:19 org.apache.commons.httpclient.HttpMethodDirector processWWWAuthChallenge
INFO: No credentials available for BASIC 'xyz.dddd.tld'@http://xyz.dddd.tld:80
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><HTML><HEAD><TITLE>Sie haben nicht die erforderliche Berechtigung, um die Seite anzuzeigen</TITLE> <META HTTP-EQUIV="Content-Type" Content="text/html; charset=windows-1252"><STYLE type="text/css">BODY{font:8pt/12pt verdana}H1{font:13pt/15pt verdana}H2{font:8pt/12pt verdana}A:link{color:red}A:visited{color:maroon}</STYLE> </HEAD><BODY><TABLE width=500 border=0 cellspacing=10><TR><TD><h1>Sie haben nicht die erforderliche Berechtigung, um die Seite anzuzeigen</h1>Sie verfügen nicht über die Berechtigung, dieses Verzeichnis oder diese Seite unter Verwendung der von Ihnen bereitgestellten Anmeldeinformationen anzuzeigen, weil Ihr Webbrowser ein <B>WWW-Authenticate</B>-Headerfeld sendet, das die Konfiguration des Webservers nicht akzeptieren kann.<hr><p>Versuchen Sie Folgendes:</p><ul><li>Wenn Sie Ihrer Meinung nach in der Lage sein sollten, dieses Verzeichnis bzw. diese Seite anzuzeigen, wenden Sie sich an den Websiteadministrator.</li> <li>Klicken Sie auf die Schaltfläche <a href="javascript:location.reload()"><B>Aktualisieren</B></a>, um es mit anderen Anmeldeinformationen erneut zu versuchen.</li></ul><h2>HTTP&nbsp;Error&nbsp;401.2 - Unauthorized: Access is denied due to server configuration favoring an alternate authentication method. (HTTP-Fehler&nbsp;401.2 - Nicht autorisiert: Der Zugriff wurde verweigert, weil die Serverkonfiguration eine andere Authentifizierungsmethode verlangt.)<br>Internetinformationsdienste (Internet Information Services oder IIS)</h2><hr><p>Technische Informationen (für Supportpersonal)</p><ul><li>Wechseln Sie zu <a href="http://go.microsoft.com/fwlink/?linkid=8180">Microsoft Product Support Services</a>, und suchen Sie nach den Worten &quot;HTTP&quot; und &quot;401&quot;.</li> <li>Öffnen Sie die IIS-Hilfe, die im IIS-Manager (<b>inetmgr</b>) zur Verfügung steht, und suchen Sie nach den Themen &quot;Informationen zur Sicherheit&quot;, &quot;Authentifizierung&quot; und &quot;Informationen zu benutzerdefinierten Fehlermeldungen&quot;.</li></ul></TD></TR></TABLE></BODY></HTML>
```

Wenn du echte Daten zum Testen haben willst, bitte kurz eine PM an mich. Der Server mit der Basic-Auth ist aus dem Internet erreichbar.


----------



## matdacat (10. Februar 2009)

Ersetz das Statement client.getState()... durch


```
client.getState().setCredentials(
  AuthScope.ANY,
  new UsernamePasswordCredentials( username, password ) 
);
```


----------



## matdacat (10. Februar 2009)

Ein Get zu Testzwecken:


```
HttpClient client = new HttpClient();
client.getState().setCredentials(
  AuthScope.ANY,
  new UsernamePasswordCredentials(username, password )
);
    
GetMethod method = new GetMethod(url);
int statusCode = client.executeMethod(method);
System.out.println(method.getResponseBodyAsString());
method.releaseConnection();
```


Die komplette Upload-Methode müsste dann so aussehen (natürlich mit entsprechend abgeänderter Url für das Upload-Skript):


```
HttpClient client = new HttpClient();
client.getState().setCredentials(
  AuthScope.ANY,
  new UsernamePasswordCredentials(username, password)
);
    
File f = new File("c:\\test.png");
    
PostMethod method = new PostMethod(url);
Part[] parts = {
  new StringPart("titel", "Test"),
  new StringPart("sttime", "000000"),
  new StringPart("entime", "000000"),
  new StringPart("sttag", "10"),
  new StringPart("stmon", "2"),
  new StringPart("stjahr", "2009"),                
  new StringPart("entag", "20"),
  new StringPart("enmon", "2"),
  new StringPart("enjahr", "2009"),        
  new FilePart("userfile", f)
};
    
method.setRequestEntity(new MultipartRequestEntity(parts, method.getParams()));
int statusCode = client.executeMethod(method);
System.out.println(method.getResponseBodyAsString());
method.releaseConnection();
```


----------



## AlexD1979 (16. Februar 2009)

matdacat hat gesagt.:


> Ein Get zu Testzwecken:
> 
> 
> ```
> ...



Besten Dank damit hat es wunderbar funktioniert!

Nur noch eine kurze Frage zum Thema Proxy, kann man der Javaklasse mitgeben, dass sie einen Proxy nutzen soll mit Authentifizierung?


----------



## matdacat (16. Februar 2009)

Siehe 


```
client.getHostConfiguration().setProxy(...);
client.getState().setProxyCredentials(...);
```

via  ;-)


----------

