как сделать запрос данных с сервера?

  • Автор темы nadezdaMP
  • Дата начала
N

nadezdaMP

#1
на сервере есть база данных, в ней форма, по нажатию кнопки отображаются данные с ресурса в инете. пользователь открывает базу у себя, при попытке получить данные с инета лотус запрашивает логин пароль на доступ к прокси. на сервере доступ к инету осуществляется напрямую, без логина-пароля. значит запрос данных идет не с сервера а с клиента.
как обойти запрос пароля логина у пользователя? чтобы запрос данных был с сервера? :)
 

Omh

Lotus team
04.07.2007
2 210
1
#2
В голову лезет всякая фигня вроде серверный агент с одной стороны и
Код:
Call notesUIWorkspace.URLOpen( Url$, reload%, urlList%, charset$, webusername$, webpassword$, proxywebusername$, proxywebpassword$, notesRetriever )
с другой.
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 601
277
#3
вебретривер? :)
ставим клиенту тунель на сервер, биндим все адреса на локалхост...
но всё это от лукавого - не надо бороться с админами - накажут :)
 
N

nadezdaMP

#5
Не судите строго!!! =))

Sub Click(Source As Button)
Set session = New NotesSession
Set ws = New notesuiworkspace
Set db = session.CurrentDatabase
Set doc=ws.CurrentDocument.Document

Set xml = CreateObject("Microsoft.XMLHTTP")
For i = 1 To ...
Select Case i
Case 1 ' Погода
url$ = "http://informer.gismeteo.ru/rss/27612.xml"
Case 2
................................................................................
..........................
End Select
w_1$ = "w" + Cstr(i) + "_1"
w_2$ = "w" + Cstr(i) + "_2"
w_3$ = "w" + Cstr(i) + "_3"
w_4$ = "w" + Cstr(i) + "_4"
Call GetWeather(url$, w_1$, w_2$, w_3$, w_4$)
Next
Call doc.Save(True, True)

End Sub


Sub GetWeather(inUrl As String, w_1 As String, w_2 As String, w_3 As String, w_4 As String)
Call xml.open("GET", inUrl, False)
Call xml.send()
w1$ = xml.responseText
w1$ = Strright(w1$, "<item>")
w2$ = w1$
w1$ = Strleft(w1$, |</item>|)
w1_t$ = Strright(w1$, "<title>")
w1_t$ = Strleft(w1_t$, |</title>|)
w1_d$ = Strright(w1$, "<description>")
w1_d$ = Strleft(w1_d$, |</description>|)

w2$ = Strright(w2$, "<item>")
w2$ = Strleft(w2$, |</item>|)
w2_t$ = Strright(w2$, "<title>")
w2_t$ = Strleft(w2_t$, |</title>|)
w2_d$ = Strright(w2$, "<description>")
w2_d$ = Strleft(w2_d$, |</description>|)
Call doc.ReplaceItemValue(w_1, Cstr(w1_t$) + "; " )
Call doc.ReplaceItemValue(w_2, Cstr(w1_d$) + "; ")
Call doc.ReplaceItemValue(w_3, Cstr(w2_t$) + "; " )
Call doc.ReplaceItemValue(w_4, Cstr(w2_d$) + "; ")
End Sub

это код кнопки на форме, база на сервере. с админами лень разбираться, лучше что нибудь придумать =)


пробовала реализовать следующим образом - шедульным агентом в базе на сервере скачивать данные и сохранять в отдельный документ, при открытии базы брать данные уже из этого дока, но у меня не получилось, как только не пробовала.
видимо потому что при создании нового дока, при открытии базы, у notesUIdocument "отсутствует" свойство Document (хотела взять текущий документ), наткнулась на форуме. или как то это можно сделать?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 601
277
#6
а здесь нечего судить :(
вы исползуете мсявую шнягу имярек АктивХу
оно инициализируется на клиенте и, стало быть, на клиенте и тянет
использовать на сервере АктивХу ябы не рекомендовал (можете и сервак уронить доминошный)
переписывайте на вызов агента на сервере и джава (примеров достаточно)

и UI классы невозможно юзать на сервере (по понятным причинам)
агенту надо передать UNID дока, в него слить содержимое и получить резалт в клиенте
 
N

nadezdaMP

#7
агенту передать юнид дока, и записать в него содержимое, то понятно,
непонятно как получить резалт в клиенте, можно подробнее, пример бы =)

если агента переписать на ява, то нужно будет на сервере домино службу вебретривер запускать? а на лотус скрипте сделать никак??

и буду очень благодарна, если скинете ссылку на какой нибудь такой один пример(агента)!!! потому что научно тыкать во все не хочется!! =)
 

susinmn

Well-known member
16.10.2007
529
3
#8
Call xml.open("GET", inUrl, False,"логин к прокси","пароль к прокси") или что-то в этом роде...
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 601
277
#9
ретривр запускать не надо
в джава ничего страшного нет (сплошные плюсы :( )
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 601
277
#11
джава пример:
http://www.nsftools.com/tips/InternetFile.java
и вообще - ресурс http://www.nsftools.com/tips
крайне полезен :(
можете парсить на клиенте, можете на сервере

доминошный db.getdocumentByURL имеет ограничения и невсегда удобен (и тогда вот возня с Нафигатор БД и ретривером)

есть более простой вариант (джава)
http://web3.inttrust.ru/Site/itforum.nsf/f...33;OpenDocument

а читать по getdocument (и почему лучше не юзать):
http://web3.inttrust.ru/Site/itforum.nsf/a...BD?OpenDocument
 
13.03.2009
625
1
#12
nadezdaMP
вроде можно малой кровью: заменив Microsoft.XMLHTTP на MSXML2.XMLHTTP. Второй умеет юзать прокси из настроек IE.
 
N

nadezdaMP

#13
простой агент на яве, в базе на сервере(на сервере стоит линукс)
заваливается на команде url.openStream();
подключение к локальным и фтп ресурсам выполняется без претензий, при попытке подключиться к ресурсу в инете не срабатывает, подскажите пожалуйста почему?)

видимо нужно указать настройки прокси? если да то каким образом?
Код:
import lotus.domino.*;
import java.net.*;
import java.io.*;
import java.util.Vector;

public class JavaAgent extends AgentBase {

public void NotesMain() {

try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
// (Your code goes here) 

URL url = new URL("http://informer.gismeteo.ru");
InputStream is = url.openStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is, "windows12-51"));
try {
String nextLine=null;
while ((nextLine=br.readLine())!=null) 
System.out.println(nextLine);
}
catch(EOFException e) {
e.printStackTrace();
}

br.close();
is.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 601
277
#14
чтобы понять "почему" - обычно, достаточно посмотреть трэйс стека ошибок... (он выводится на консоль сервера, в данном случ.)
такое ощущение - что первую ссылку вы даже не смотрели :D
там третий конструктор использует адрес прокси и порт

а чтобы было с авторизацией:
http://www.javaworld.com/javaworld/javatip...-javatip42.html
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 601
277
#16
а каким именно образом? интересно, почему такое может произойти.
очень просто - все АктивХу - суть инородные элементы для Домино (исключая таковые самой Домины)...
это dll, кот. написаны непонятно кем (в общем случае) вне чётких спецификаций (у МС они постоянно меняются ;) )
вызовы их могут вызывать блокировки файлов, процессов, обращение к ГУИ...
всё это неподконтрольно вызывающему процессу
в конечном итоге, часто, приводит к утечкам памяти (опять же - неконтролируемым)
повторный вызов может вернуть некоректную структуру, что вызовет (это ведь нативный бинарник) крах вызывающего (читайте - Домино)

добавим сюда зависимость КОМов от процесса регистации и, стало-быть, целостности регистри (тяжёлой и корявой реализации хранения настроек в Виндовз)

др. словами - вероятность обрущения Домины сторонними длл больше, нежели родными, и к этому добавляются ошибки реализации ф-ций, кот. закрыты и неизменны (в тек. реинкарнации, конкрет. изделия АктивХу)
 
N

nadezdaMP

#17
код на яве, не судите строго =))
если кому интересно, и чтоб новичкам не мучаться

Код:
import lotus.domino.*;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import java.io.InputStream;
import java.net.URL;

public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
// (Your code goes here) 
Log log = session.createLog("javaxml");
log.openFileLog("c:/javaxml.log");
System.setProperty("http.proxyHost", "000.000.000.000");  //прокси
System.setProperty("http.proxyPort", "0000");		 //порт
System.setProperty("http.proxyUser", "user");
System.setProperty("http.proxyPassword", "password");
//URL url = new URL("http://informer.gismeteo.ru/rss/29838.xml");	//у меня к инету не подключается хоть убейся
URL url = new URL("file://localhost/C:/1.xml");								 //зато с локала читает на ура
InputStream inputStream = url.openConnection().getInputStream();
try{
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse(inputStream);
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();
XPathExpression xPathExpression = xPath.compile("/rss/channel/item");
NodeList nodeList = (NodeList)xPathExpression.evaluate(document, XPathConstants.NODESET);
for (int i=0; i<nodeList.getLength(); ++i) {
Element element = (Element)nodeList.item(i);
String title = element.getElementsByTagName("title").item(0).getTextContent();
String description = element.getElementsByTagName("description").item(0).getTextContent();
// вот тут можно сохранить в базу
System.out.println(title + ": " + description);
}
}
finally {
inputStream.close();
}

//log.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
почему с инета не читает не ясно.