:: Visual Foxpro, Foxpro for DOS
HTTP-запрос Есть какие-то ограничения по его длине?
PavlikPavlikovich
Автор

Сообщений: 176
Дата регистрации: 21.07.2010
Здравствуйте!
Имеется видеорегистратор "Линия"
НА него посредством HTTP-запроса можно передавать данные на сервер видеонаблюдения. Для их отображения рядом с камерой. (что-то типа OSD текста).
Всё работает, но когда osdstr1 и osdstr2 слишком длинные, ну как длинные. В сумме символов 20 или чуть больше и всё. Сразу на строке "lcCredenciales=" ошибка (Команда содержит нараспознанное ключевое слово или фразу)
т.е. проблема я как понимаю в длине. Строка обрезалась и появилась нераспознанная фраза.
Может мне кто-то что-то посоветовать, может запрос как-то поделить? Пихать частями и.т.д.

lcURL = "http://192.168.1.123:9786/rpc"
lcBoundary = [------------957825eee5914fecb6d15609b790db30]
loHTTP = CREATEOBJECT("MSXML2.XMLHTTP")
osdstr2="строка с текстом 1"
osdstr2="строка с текстом 2"
lcCredenciales = '{"method":"post_event","params" :{"event":{"type":"general","camera":"5","duration":[23, 59],"source":"any","name":"&osdstr1","data":"&osdstr2","osd":"0"},;
"targets":[{"target":"reactions"},{"target":"archive"},{"target":"clients"}]},"version":57}'
*открываем HTTP-подключение к ресурсу HTTP.
loHTTP.OPEN("POST", lcURL, .F.,"admin","12345") && F- Указывает, следует ли открывать в асинхронном режиме.
loHTTP.SetRequestHeader("Content-Type","application/json; charset=windows-1251")
* следующий заголовок обязательный, т.к. задает способ организации данных в запросе
*loHTTP.setRequestHeader( "Content-Type", [multipart/form-data; boundary=] + m.lcBoundary )
loHTTP.SetRequestHeader("Content-Type", [multipart/form-data; boundary=] + lcBoundary )
* длина тела - на всякий случай. В некоторых примерах ее не устанавливали, но, возможно, это
* скрыто внутри тех средств, которые использовали авторы
loHTTP.SetRequestHeader("Content-Length", LEN(lcCredenciales))
*отправляем HTTP-запрос на HTTP-сервер
loHTTP.SEND(lcCredenciales)
********************************************************************************
Ratings: 0 negative/0 positive
Re: HTTP-запрос Есть какие-то ограничения по его длине?
sphinx

Сообщений: 31402
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
lcCredenciales = '{"method":"post_event","params" :{"event":{"type":"general","camera":"5","duration":[23, 59],"source":"any","name":"&osdstr1","data":"&osdstr2","osd":"0"},;
"targets":[{"target":"reactions"},{"target":"archive"},{"target":"clients"}]},"version":57}'

Попробуй сформировать эту строку через TEXT... ENDTEXT.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: HTTP-запрос Есть какие-то ограничения по его длине?
akvvohinc

Сообщений: 4261
Откуда: Москва
Дата регистрации: 11.11.2008
Если ошибка при создании строки, то к чему нам знать, для чего она? (я о видеорегистраторе и его типе).
И какое отношение к этой ошибке имеет заголовок темы - "HTTP-запрос Есть какие-то ограничения по его длине?"

Вот этого было бы вполне достаточно:
Цитата:
osdstr1="строка с текстом 1"
osdstr2="строка с текстом 2"

lcCredenciales = '{"method":"post_event","params" :{"event":{"type":"general","camera":"5","duration":[23, 59],"source":"any","name":"&osdstr1","data":"&osdstr2","osd":"0"},;
"targets":[{"target":"reactions"},{"target":"archive"},{"target":"clients"}]},"version":57}'

Очевидно, что присвоить переменной строковую константу длиной более 255 символов Фокс не позволяет (написано в Help).
Но ничто не мешает "наращивать" длину строки по частям или использовать другие способы, например, предложенный выше.

Кстати, если бы вы вместо совершенно необязательных макро использовали обычную конкатенацию строк (оператор "+"), то на приведенных данных ошибки бы не было - ни одна строковая константа здесь не превышает 255 по длине.



Исправлено 4 раз(а). Последнее : akvvohinc, 06.05.24 20:19
Ratings: 0 negative/0 positive
Re: HTTP-запрос Есть какие-то ограничения по его длине?
sphinx

Сообщений: 31402
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Цитата:
Кстати, если бы вы вместо совершенно необязательных макро использовали обычную конкатенацию строк (оператор "+"), то на приведенных данных ошибки бы не было

А, там еще и макро, не всю строку посмотрел. Зло же это, от макро только блажь и тревога. И проблемы. Макро выкинуть. И будет работать.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: HTTP-запрос Есть какие-то ограничения по его длине?
sphinx

Сообщений: 31402
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
TEXT TO lcCredenciales TEXTMERGE NOSHOW PRETEXT 1+4
{"method":"post_event","params" :{"event":{"type":"general","camera":"5","duration":[23, 59],"source":"any","name":"<<osdstr1>>","data":"<<osdstr2>>","osd":"0"},;
"targets":[{"target":"reactions"},{"target":"archive"},{"target":"clients"}]},"version":57}
ENDTEXT


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: HTTP-запрос Есть какие-то ограничения по его длине?
pasha_usue

Сообщений: 3658
Откуда: Е-бург
Дата регистрации: 06.10.2006
Я бы проверил наличие неэкранированных служебных символов в osdstr1 и в osdstr2. Экранировать надо двойные кавычки и обратный слэш (", \).

А ну и ещё вопрос, в какой кодировке ожидаются русские символы, да и вообще всё, что за рамками Portable Character Set.



Исправлено 1 раз(а). Последнее : pasha_usue, 07.05.24 07:08
Ratings: 0 negative/0 positive
Re: HTTP-запрос Есть какие-то ограничения по его длине?
PaulWist

Сообщений: 14659
Дата регистрации: 01.04.2004
Цитата:
osdstr2="строка с текстом 1"
osdstr2="строка с текстом 2"

А где собственно osdstr1 ?


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: HTTP-запрос Есть какие-то ограничения по его длине?
akvvohinc

Сообщений: 4261
Откуда: Москва
Дата регистрации: 11.11.2008
pasha_usue
Я бы проверил наличие неэкранированных служебных символов в osdstr1 и в osdstr2. Экранировать надо двойные кавычки и обратный слэш (", \).
Зачем нужно их экранировать?
И почему именно в этих двух переменных?
Ratings: 0 negative/0 positive
Re: HTTP-запрос Есть какие-то ограничения по его длине?
akvvohinc

Сообщений: 4261
Откуда: Москва
Дата регистрации: 11.11.2008
PaulWist
А где собственно osdstr1 ?
Это просто описка - osdstr1, естественно, в первом случае из двух.
Иначе бы код вообще никогда не работал, но автор пишет
Цитата:
Всё работает, но когда osdstr1 и osdstr2 слишком длинные...
Ratings: 0 negative/0 positive
Re: HTTP-запрос Есть какие-то ограничения по его длине?
pasha_usue

Сообщений: 3658
Откуда: Е-бург
Дата регистрации: 06.10.2006
akvvohinc
pasha_usue
Я бы проверил наличие неэкранированных служебных символов в osdstr1 и в osdstr2. Экранировать надо двойные кавычки и обратный слэш (", \).
Зачем нужно их экранировать?
И почему именно в этих двух переменных?
Потому что нет других мест, откуда могут прийти неэкранированные символы. Но они факт сломают разметку JSON.

Вот такой JSON будет невалидным.
{"method":"post_event","params" :{"event":{"type":"general","camera":"5","duration":[23, 59],"source":"any","name":"Моя строчка "с кавычками".","data":"Моя вторая строчка со \ слэшем","osd":"0"},;
"targets":[{"target":"reactions"},{"target":"archive"},{"target":"clients"}]},"version":57}



Исправлено 1 раз(а). Последнее : pasha_usue, 07.05.24 09:56
Ratings: 0 negative/0 positive
Re: HTTP-запрос Есть какие-то ограничения по его длине?
pasha_usue

Сообщений: 3658
Откуда: Е-бург
Дата регистрации: 06.10.2006
PavlikPavlikovich
Имеется видеорегистратор "Линия"
На исходный вопрос отвечу: Метод POST практически не ограничен по объему передаваемого пакета - можно гигабайтные файлы на сервак передавать в один POST. А вот конкретная реализация веб-сервера на данном видеорегистраторе вполне может быть куцей.
Ratings: 0 negative/0 positive
Re: HTTP-запрос Есть какие-то ограничения по его длине?
kornienko_ru

Сообщений: 235
Откуда: Владивосток
Дата регистрации: 06.09.2015
akvvohinc
Очевидно, что присвоить переменной строковую константу длиной более 255 символов Фокс не позволяет (написано в Help).
А вы уверены? Я на VFP9 оперирую строковыми литералами 16М, а на VFPA 64M. Сейчас вот считываю файлы в переменную. Проверьте командой:
Stroka=spac(16000000)
Ratings: 0 negative/0 positive
Re: HTTP-запрос Есть какие-то ограничения по его длине?
akvvohinc

Сообщений: 4261
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
А вы уверены? Я на VFP9 оперирую строковыми литералами 16М, а на VFPA 64M. Сейчас вот считываю файлы в переменную. Проверьте командой:
Stroka=spac(16000000)
Я уверен.
spac(16000000) - это не строковая константа, а вызов функции, возвращающей строку. Именно вызов функции попадет в FXP в результате компиляции.

Попробуйте написать именно константу длиной 256 (как в примере у автора)
Stroka = '________ ... ____________'

Цитата:
Я на VFP9 оперирую строковыми литералами 16М, а на VFPA 64M.
На деле такого ограничения почти нигде нет.
Попробуйте в VFP9 считать в переменную файл размером более 16M, скажем, 100M - почти наверняка получится. ))
Ratings: 0 negative/0 positive
Re: HTTP-запрос Есть какие-то ограничения по его длине?
alex;

Сообщений: 2961
Откуда: Москва
Дата регистрации: 23.11.2004
kornienko_ru
akvvohinc
Очевидно, что присвоить переменной строковую константу длиной более 255 символов Фокс не позволяет (написано в Help).
А вы уверены? Я на VFP9 оперирую строковыми литералами 16М, а на VFPA 64M. Сейчас вот считываю файлы в переменную. Проверьте командой:
Stroka=spac(16000000)
Я так понимаю, речь идет о литерале в кавычках или квадратных скобках.
Ratings: 0 negative/0 positive
Re: HTTP-запрос Есть какие-то ограничения по его длине?
kornienko_ru

Сообщений: 235
Откуда: Владивосток
Дата регистрации: 06.09.2015
PavlikPavlikovich
loHTTP.SetRequestHeader("Content-Type", [multipart/form-data; boundary=] + lcBoundary )
* длина тела - на всякий случай. В некоторых примерах ее не устанавливали, но, возможно, это
* скрыто внутри тех средств, которые использовали авторы
loHTTP.SetRequestHeader("Content-Length", LEN(lcCredenciales))
*отправляем HTTP-запрос на HTTP-сервер
loHTTP.SEND(lcCredenciales)
********************************************************************************
Еще такой момент. А зачем multipart/form-data и Content-Length? Вы файлы передаете или строку? Если строку, то попробуйте так:
oHTTP.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
loHTTP.SEND(lcCredenciales)
Если в строке lcCredenciales есть русские буквы то их нада инкодировать. Посмотрите функцию Strconv. Там кодировка экранирует коды знаками процента, а пробелы заменяются плюсиком "+". Можете сами пробелы заменить на "+".
Ratings: 0 negative/0 positive
Re: HTTP-запрос Есть какие-то ограничения по его длине?
akvvohinc

Сообщений: 4261
Откуда: Москва
Дата регистрации: 11.11.2008
pasha_usue
Потому что нет других мест, откуда могут прийти неэкранированные символы. Но они факт сломают разметку JSON.
Понятно.
Я думал, что ваш ответ относится к устранению той ошибки, с которой столкнулся автор.
А она у JSON-формату отношения не имела.

pasha_usue
На исходный вопрос отвечу: Метод POST практически не ограничен по объему передаваемого пакета
Автор ошибся с формулировкой вопроса - его проблема не касалась длины (объема) передаваемого текста.
Ratings: 0 negative/0 positive
Re: HTTP-запрос Есть какие-то ограничения по его длине?
akvvohinc

Сообщений: 4261
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Если в строке lcCredenciales есть русские буквы то их нада инкодировать.
Проблема автора решена и не была никак связана с обменом данными с устройством.
Обычная ошибка, связанная с нарушением одного из ограничений Фокса.



Исправлено 1 раз(а). Последнее : akvvohinc, 07.05.24 17:26
Ratings: 0 negative/0 positive
Re: HTTP-запрос Есть какие-то ограничения по его длине?
kornienko_ru

Сообщений: 235
Откуда: Владивосток
Дата регистрации: 06.09.2015
Алекс, про кавычки может оно и так, но зачем что-то так много писать в кавычках. Даже 255 неудобно будет читать. В конце строки кавычку закрыть поставить плюсик и открыть кавычку на следующей строке.... и так сколько хотите. Выше уже об этом было. Просто ответил из приличия к вашему вопросу.
Ratings: 0 negative/0 positive
Re: HTTP-запрос Есть какие-то ограничения по его длине?
akvvohinc

Сообщений: 4261
Откуда: Москва
Дата регистрации: 11.11.2008
alex;
Я так понимаю, речь идет о литерале в кавычках или квадратных скобках.
Вот об этом:
Maximum length of a string literal - 255
Ratings: 0 negative/2 positive
Re: HTTP-запрос Есть какие-то ограничения по его длине?
alex;

Сообщений: 2961
Откуда: Москва
Дата регистрации: 23.11.2004
akvvohinc
alex;
Я так понимаю, речь идет о литерале в кавычках или квадратных скобках.
Вот об этом:
Maximum length of a string literal - 255
именно это я и имел ввиду
Ratings: 0 negative/2 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 18 (Гостей: 18)

© 2000-2024 Fox Club 
Яндекс.Метрика