src.Request_Content(0) не работает через AJAX и еще пару вопросов.

NetWood

Lotus Team
17.04.2008
565
96
BIT
174
Всем привет! Давно я не брал в руки шашку).

Жили, не тужили, ломились напрямую к серверу агентом из WQS с перезагрузкой web страницы и все замечательно работало. Моргало, правда). Но задумалось тут полностью перейти на jQuery ajax. И началось...
1. Не работает src.Request_Content(0) при запуске из конструкции JS $.post('UpdateCart?OpenAgent'. Request_Content тупо пустой. Я конечно, запихнул args через argsArray = explode(src.Query_String(0), "&"), и сделал так $.post('UpdateCart?OpenAgent'+args, но там есть ограничение по размеру урла. Его можно подкрутить через настройку в сервере по link removed, но как вернуть Request_Content?

2. Был старый агент на LS пускаемый по тупо-сабмиту на форме и в котором работала конструкция:
Print(script common.js)
Print(script _doSetCookie('shopcart') & Cstr(userdoc.UniversalID)
(я не смог загрузить ее полным текстом в пост из-за какого-то дебильного алерта на форуме с ахтунгом "This website is using a security service to protect itself from online attacks.")
Куки отказались писаться при запуске через AJAX вот так $.post('AddToCart?OpenAgent', Пришлось переписывать агент LS на $.post('AddToCartAJAX?OpenAgent'+args + '&SessionID=' + sessionID+'&rnds='+rndsess, и дальнейшее в котром ищу прописанное в агенте по параметрам rndsess. И дальше
Код:
$.getJSON('doValidateUNIDjson?openpage'+'&rnds='+rndsess;
                       function(resp){
                           var respunid = resp.unid;
                           if ( respunid != null) {_doSetCookie('shopcart', respunid) };
Может оно и к лучшему, но ЧЯДНТ?

3. При подсчете в JS вот такой конструкции:
Код:
var boxes = $("form[name='Cart']  input:checkbox:enabled");
isboxes.each(function(){
    chboxes = chboxes+1;
    args = args + "&" + $(this).attr('name')+'=1';
});
chboxes возвращает максимум 50. Но у меня бывает и больше чекбоксов. Это ограничение где порылось? Заткнул так
Код:
 if ( chboxes >=50 ) {
            $.msgbox('Более 50 товаров удалить сразу нельзя.',4);
                boxes.removeAttr('checked');

ку1: Сервер 8.5.2. Клиент 7.0.4. jquery-1.12.4.min.js Если что. Про xpages даже слышать не хочу.
ку2: Попутно был найден и заюзан неплохой WebSession class originally from , но в нем нет метода прописывания кук в агенте LS. Может кто доделывал?
 
Последнее редактирование:

savl

Lotus Team
28.10.2011
2 624
314
BIT
540
Может кто доделывал?
Нашел вот что, но не проверял. Думаю, Вы сможете это подкрутить к Вашему классу.
Код:
Function getCookieVal( cookie As String, thisname As String) As String
Dim prefix As String
prefix = thisname + "="
Dim begin As Integer
Dim ending As Integer
begin = Instr(cookie, "; " + prefix)
If begin = 0 Then
begin = Instr(cookie, prefix)
If begin = 0 Then
getCookieVal = ""
Exit Function
End If
Else
begin = begin +2
End If
ending = Instr(begin, cookie, ";") - 1
If ending = -1 Then
ending = Len(cookie)
End If
getCookieVal = unescape(Mid$(cookie, begin+Len(prefix), ending - begin -Len(prefix)+1))
End Function

Sub setCookie(doc As NotesDocument, compName As String, compValue As String, adjYear As Integer, adjHour As Integer)
' uses a print statement to set the cookie
' uses adjYear and adjHour to set the expiry time of the cookie.
' If the cookie is needed for the one particular session set adjHour to 1, then the cookie is active for an hour
' If you want to expire a cookie, use a negative number for either adjYear or adjHour.
Dim thistime As NotesDateTime
Dim gmttime As NotesDateTime
Dim gmtvar As Variant
Dim cooktime As String
Set thistime = New NotesDateTime("")
Call thistime.SetNow
If adjHour <> 0 Then
Call thistime.AdjustHour(adjHour)
End If
If adjYear <> 0 Then
Call thistime.AdjustYear(adjYear)
End If
Set gmttime = New NotesDateTime(Left$(thistime.GMTTime, Len(thistime.GMTTime)-4))
gmtvar = gmttime.LSLocalTime
cooktime = Format(gmtvar, "dddd")+ ", " + Format(gmtvar, "dd")+ "-" + Format(gmtvar, "mmm") + "-" + Format(gmtvar, "yyyy") +_
" " + Format(gmtvar, "hh:mm:ss") + " GMT"
compName = escape(compName)
compValue = escape(compValue)
Dim dbpath As String
dbpath = Strleft(Lcase(doc.Path_Info_Decoded(0)), ".nsf") + ".nsf"+ "/"
Print "Set-Cookie: " + compName + "=" + compValue + "; expires=" + cooktime + "; path=" + dbpath + ";"
End Sub

Function escape(strIn As String) As String
Dim strAllowed As String
Dim i As Integer
Dim strChar As String
Dim strReturn As String

strAllowed = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" & "@/.*-_"
i = 1
strReturn = ""
While Not (i > Len(strIn))
strChar = Mid$(strIn, i, 1)
If Instr(1, strAllowed, strChar) > 0 Then
strReturn = strReturn & strChar
Else
strReturn = strReturn & "%" & Hex$(Asc(strChar))
End If
i = i + 1
Wend
escape = strReturn
End Function

Function unescape(strIn As String) As String
Dim i As Integer
Dim strChar As String
Dim strReturn As String

i = 1
strReturn = ""
While Not (i > Len(strIn))
strChar = Mid$(strIn, i, 1)
If Not strChar = "%" Then
strReturn = strReturn & strChar
Else
i = i + 1
strChar = "&H" & Mid$(strIn, i, 2)
strReturn = strReturn & Chr$(Val(strChar))
i = i + 1
End If
i = i + 1
Wend
unescape = strReturn
End Function
Взято тут:
Автор переносил свой блог, исходник его класса вот тут:
 
R

romych2004

1) вторым параметром данные точно передаются?:) реквест контент меньше 64кб?
3) какой-то странный селектор для чекбокса. А такой пробовали - input:checked?

p.s. сложно судить что у вас не так, т.к. код везде не полный :) Может в файлик запихнете и приаттачите?
 
  • Нравится
Реакции: lmike

NetWood

Lotus Team
17.04.2008
565
96
BIT
174
куда вернуть?
получить в агенте?
Да, получить Request_Content в агенте. src.Request_Content(0)из аякса пустой.
1) вторым параметром данные точно передаются?:) реквест контент меньше 64кб?
Попробую REQUEST_CONTENT_000...
[doublepost=1484258867,1484249208][/doublepost]Ответ на вопрос п.3 весьма неожиданный. Server -> Internet Protocols panel -> Domino Web Engine -> Число строк на странице по умолчанию: 50. Поставил больше и $("form[name='Cart'] input:checkbox:enabled"). length стал показывать нормально. LOL. Какое отношение имеет JS исполняемый на клиенте к количеству строк сервера. Еще nginx фронтом стоит. Думал, он дуркует.
 
Последнее редактирование:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
470
Число строк на странице по умолчанию: 50. Поставил больше и $("form[name='Cart'] input:checkbox:enabled"). length стал показывать нормально.
ну если посылается запрос в БД (аякс) - будет влиять
[doublepost=1484285496,1484285225][/doublepost]
1) вторым параметром данные точно передаются?:) реквест контент меньше 64кб?
неожиданный ход индусской мысли ;)
 

NetWood

Lotus Team
17.04.2008
565
96
BIT
174
Итак, проверил src.REQUEST_CONTENT_000(0) = пусто

Зову аяксом так:
Код:
$.post('UpdateCartAJAX?OpenAgent'+ args,
            {
            beforeSend: function(){$("#cart_count").fadeOut()} ,
            complete: function(){$("#cart_count").fadeIn()}
             },
              function(){
                $("#cart_count").load("doViewCartCount?ReadForm");
              }, "html");
В агенте LS src.Request_Content(0)=beforeSend=undefined&complete=undefined.
Если закоментить beforeSend и complete, то src.Request_Content(0) пустой.
[doublepost=1484347911,1484337458][/doublepost]В общем, пришел к выводу, что халява с link removed передаваемым по простому сабмиту с формы, на AJAX не проходит.
Данные для Request_Content надо заранее парсить со страницы и явно указывать параметром data в $.ajax.

Работает так:
Код:
testpost :="<a href='javascript:_doTestAJAXPost();' class='bodytext'>_doTestAJAXPost</a>";
@(Implode(testpost))

JavaScript:
function _doTestAJAXPost(){
    var url = '1TestAJAX?OpenAgent';
    var itext = $("input:text"); //все текстовые инпуты
    var boxes = $("input:checkbox:enabled"); //все чекбоксы
    var isboxes = $("input:checkbox:checked"); //все отмеченные чекбоксы
    var args = '';
    //check ALL input:text value
    itext.each(function(){
    args = args + "&" + $(this).attr("name") + "=" + $(this).val();
    });
    //check input:checkbox checked
    isboxes.each(function(){
    args = args + "&" + $(this).attr('name');
    });
    $.alert(args);  //свой алерт с autocountdown
    //var datastr = encodeURI(args);
    var datastr = args;
    //https://jquery-docs.ru/jQuery.ajax/
    $.ajax({
            url: url,
            type: 'post',
            data: datastr,                //Данные отправляемые на сервер = src.Request_Content(0)
            //dataType : "html",             // тип загружаемых данных
            success: function(){$.msgbox('complete _doTestPost')} // свой обработчик на функцию success
    });
}

Код:
Sub Initialize
    'Тестовый Агент проверки AJAX 1TestAJAX
    On Error Goto errHnd
    '=== WebSession class originally from http://tanny.ica.com/ICA/TKO/tkoblog.nsf/dx/websession-agent-class
    Dim web As New WebSession()
    Dim arg As Variant, arg2 As String, arguments List As String
    arg =  web.session.DocumentContext.Request_Content(0)
    Msgbox "ws.Request_Content(0)="+arg
    arg2 =  web.session.DocumentContext.Query_String(0)
    Msgbox "ws.Query_String(0)="+arg2
errHnd:
    'If error, let user know - redirect web browser to Order Error page
    Print "Error #:" + Str(Err)+ " line: "+ Cstr(Erl)
End Sub

В консоли имеем что-то такое:
14.01.2017 01:39:31 HTTP Server: Agent message: ws.Request_Content(0)=&8868C36
A7E41D17FC32578550037BA66=1&E0979BA5BAEF22C4C32578550037BAB4=2&4A7AF14E7E354D73C
32578550037BE48=3&2842350FDFDEC9DEC32578550037BA8C=&63B44202751E197CC32578550037
BD59=&287771D053AB43FBC32578550037BADB=&761092244449F8C1C32578550037BF38
14.01.2017 01:39:31 HTTP Server: Agent message: ws.Query_String(0)=OpenAgent
 
Последнее редактирование:

rinsk

Lotus Team
12.11.2009
1 156
126
BIT
44
используйте ф-цию серелизации .serialize()
всегда работало без проблем:
JavaScript:
        var formdata=$(document.forms[0]).serialize();
        $.post(url,formdata, function(data) {

        })

Если для некоторых полей (уменьшить оверхед) - то типа такого :

JavaScript:
function serializeFields(fieldList){
    // сериализация только нужных полей текущей формы
    // поля перечислены через запятую. Регистр - важен
    return $('form:first').find('input[name="'+fieldList.split(",").join('"],input[name="')+'"]').serialize()
}

    var formdata=serializeFields('EditDoc,Action,ID,UNID,Form,ServiceTypeKey,RealReqKey,ReqKey,StandartKey,key,eid,Signed,Status');
        $.ajax({
             type: "POST",
             url: agent,
              data:formdata
            })
             .done(function(data) {
                    $("#param-content").html(data);
              });  
}

Ловля параметров в агенте (свыше 64 к есть другой вариант)
Код:
'Передача параметров
    v=Evaluate({@Explode(@UrlDecode("Domino";Request_Content);"&")},contextdoc)
    Forall vls In v
        tmp=vls
        If Not Iselement(ValueList(Strleft(tmp,"="))) Then
            ValueList(Strleft(tmp,"="))=Strright(tmp,"=")
        Else
            ValueList(Strleft(tmp,"="))=ValueList(Strleft(tmp,"="))+"||"+Strright(tmp,"=")
        End If
    End Forall
 
  • Нравится
Реакции: NetWood
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!