Das Notes Forum

Lotus Notes / Domino Sonstiges => Java und .NET mit Notes/Domino => Thema gestartet von: Dogmi am 07.04.09 - 17:27:03

Titel: Java Programm soll Daten an Agenten weitergeben über url
Beitrag von: Dogmi am 07.04.09 - 17:27:03
Naja wie schon beschrieben, ich haben ein Java-Programm, wo ich mittels URL eine DBView mit ?readViewEntries auslese, das funktioniert und wird alles angezeigt. Nun zum Problem: gibt es einen weg geänderte Daten von meinen Java Programm über url zurückzuschreiben.

Über die Notes jar ist das ja kein Problem, aber das kann ja jeder, ausserdem müsste der DIIOP Task laufen.

Meine überlegung ist folgendes:

ich will per url einen agenten starten, der mir dann die daten in die DB schreibt, nur leider weis ich nicht, wie man die daten (also den feldnamen, Dbname usw) mitgibt. bin da leider noch recht unerfahren was das angeht.
Titel: Re: Java Programm soll Daten an Agenten weitergeben über url
Beitrag von: m3 am 07.04.09 - 18:12:39
Basiswissen:
http://www.cs.tut.fi/~jkorpela/forms/methods.html
http://www.w3.org/TR/html401/interact/forms.html#h-17.13.1

Notes-spezifisch:
http://www.codestore.net/store.nsf/unid/DOMM-4Q8G7N?OpenDocument


Oder Kommunikation über ein Domino-Webservice?
Titel: Re: Java Programm soll Daten an Agenten weitergeben über url
Beitrag von: flaite am 07.04.09 - 19:43:58
@Martin: Was dort unter "Basiswissen" verlinkt ist, weiss ich btw. auch nicht in allen Details. Liest du das wirklich ?


SoapWebservices wäre eine Möglichkeit, allerdings kommt das schwer aus der Mode. Einfach zu viel overkill. Es sei denn du brauchst irgendeine ernsthafte Transaktionsfähigkeit, die dir Domino eh nicht liefert.

Zunächst einmal mußt du aus Java heraus einen Http Request absetzen.

hier ist ein Beispiel, wie du ein xml Dokument an einen beliebigen Server schicken kannst.
Das bietet dir zumindest die größte Flexibilität an.
Im Beispiel ist das ein soap Dokument. Es kann aber egal was sein (ausser binary, das geht aber auch). Also einfach einen String. Oder JSon. Oder normales xml (also nicht von irgendwelchen SOAP-Standardisierungs-Clowns ausgearbeites).

Auf der Domino Seite kannst du im Agenten den Inhalt des request in LotusScript so bekommen:
Code
req=doc.Request_Content(0) 


Javaauf der Client Seite (dein Java Programm)
Code
import java.io.IOException;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpState;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.RequestEntity;
import org.apache.commons.httpclient.methods.StringRequestEntity;

public class DoPost {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws HttpException 
	 */
	public static void main(String[] args) throws HttpException, IOException {
		String body = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" 
xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><soapenv:Body><theName xmlns=\"urn:DefaultNamespace\">Lotus</theName></soapenv:Body></soapenv:Envelope>";
		HttpClient client = new HttpClient();
		PostMethod post = new PostMethod("http://127.0.0.1:80/Axel/MyWebService.nsf/MyWebService");
		RequestEntity bodyEntity = new StringRequestEntity(body,  "utf-8", null);
		//post.setFollowRedirects(true);
		
		String proxyHost = "";
		int proxyPort =0 ;
		String proxyUser = ""; 
		String proxyPwd = "";
		
		String host = "127.0.0.1";
		//String host = "";
		int port = 80;
		String hostUserName = "axel janssen"; 
		String hostPwd = "udontcare"; 
		
		if (proxyHost.length() > 0) {
			DoPost.initProxy(client, proxyHost, proxyPort, proxyUser, proxyPwd);
		}
		
		if (host.length() > 0 ) {
			DoPost.initHostAuth(client, host, port, hostUserName, hostPwd);
		}
		
		
		post.setRequestEntity(bodyEntity);
		
		post.addRequestHeader("Content-Type", "text/xml; charset=utf-8");
		
		//post.addRequestHeader("Accept", "application/soap+xml, application/dime, multipart/related, text/*");
		//post.addRequestHeader("User-Agent", "Axis/1.4");
		//post.addRequestHeader("Host", "192.168.0.61:8080");
		//post.addRequestHeader("Cache-Control","no-cache");
		//post.addRequestHeader("Pragma", "no-cache");
		//post.addRequestHeader("SOAPAction", "");
		
		
		
		int result = client.executeMethod(post);
		System.out.println ("result=" + result);
		String ret = post.getResponseBodyAsString();
		System.out.println ("ret=" + ret);
	}
	
	private static void initProxy(HttpClient client, final String proxyHost, final int proxyPort,
			final String proxyUser, final String proxyPwd) {
		client.getHostConfiguration().setProxy(proxyHost, proxyPort);
		HttpState state = client.getState();
		AuthScope authScope = new AuthScope(proxyHost, proxyPort,
				AuthScope.ANY_REALM);
		state.setProxyCredentials(authScope, new UsernamePasswordCredentials(
				proxyUser, proxyPwd));
		client.getParams().setAuthenticationPreemptive(true);
	}
	
	/**
	 * Authentification for remote service.
	 * @param host remote host
	 * @param port remote port
	 * @param hostUserName remote user
	 * @param hostPwd remote password
	 */
	private static void initHostAuth(HttpClient client, final String host, final int port,
			final String hostUserName, final String hostPwd) {
		HttpState state = client.getState();
		AuthScope authScope = new AuthScope(host, port, AuthScope.ANY_REALM);
		state.setCredentials(authScope, new UsernamePasswordCredentials(
				hostUserName, hostPwd));
		client.getParams().setAuthenticationPreemptive(true);
	}

}

Die Werte für initProxy Methode benötigst du, wenn zwischen deinem JavaProgramm und dem Domino Server ein reverse proxy steht. (etwas wo man sich anmelden muß, wenn man ins Internet muß).
initHostAuth ist für Authentifzierung am Server, wenn also der Zugriff des Agenten eine Authentifizierung benötigt (default, anonymous stehen auf kein Zugriff).
Du benötigst dafür folgende jars:
commons-httpclient-3.1.jar
commons-logging-1.1.jar
commons-codec-1.3.jar

Du kannst aber auch einfach Post Felder schicken. Check die API von CommonsHttpClient "PostMethod".
Get ginge auch, aber das ist inhaltlich nun mal einfach kein get.

Gruß Axel

hoffe es hilft

Stell Fragen, falls dir etwas unklar ist.

Titel: Re: Java Programm soll Daten an Agenten weitergeben über url
Beitrag von: m3 am 07.04.09 - 22:31:33
@Martin: Was dort unter "Basiswissen" verlinkt ist, weiss ich btw. auch nicht in allen Details. Liest du das wirklich ?
Verdiene seit 10+ Jahren mein Geld damit, sowas zu wissen.
Titel: Re: Java Programm soll Daten an Agenten weitergeben über url
Beitrag von: flaite am 08.04.09 - 08:41:17
Ab einer gewissen Detailtiefe wird es willkürlich Wissen als Basiswissen zu determinieren.  ;D
Für vieles gibts einfach frameworks.

Sehr hilfreich für solche Projekte ist btw. auch noch ein TCP Monitor, der die ausgetauschten Nachrichten anzeigt.
Ich verwende dafür gerne tcpmon aus axis.
http://readmymusings.blogspot.com/2005/12/axis-tcpmon-tool-usage.html
Titel: Re: Java Programm soll Daten an Agenten weitergeben über url
Beitrag von: Dogmi am 08.04.09 - 09:49:11
jo, ich bedanke mich erstmal für den vielen input, werd mir das mal anschauen und verdauen, wenn ich fragen hab, meld ich mich  ;)