Форум программистов, компьютерный форум, киберфорум
Java: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
91 / 86 / 12
Регистрация: 08.08.2013
Сообщений: 667

NanoHttpd и ajax BAD REQUEST

10.09.2016, 21:27. Показов 2160. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет.
Не могу второй день победить.
Если JS передаёт какие нибудь параметры в POST запросе, то каждый второй запрос = BAD REQUEST, если подождать секунд 5, то ошибки нет.
Если нет никаких data от JS, то ошибок нет никаких вообще.

Помогите побороть.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.09.2016, 21:27
Ответы с готовыми решениями:

Запрос $.ajax к WCF серверу возвращает 400 Bad Request
Всем привет! Пытаюсь из js с помощью $.ajax вызвать метод вебсервиса WCF, расположенного на другом домене, но получаю ошибку 400 Bad...

Request.Response ошибка 400 bad request
Добрый день! Прошу помочь с обработкой запросов в Python 2.7.11 Принимать реквест и сохранить на сервере файл из него уже...

Ошибки Synapse (HTTP/1.1 400 Bad Request / HTTP/1.1 413 Request Entity Too Large)
Добрый день. При работе с Synapse начали возникать вот такие вот две ошибки (HTTP/1.1 400 Bad Request / HTTP/1.1 413 Request Entity Too...

20
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
11.09.2016, 13:24
Значит вы как-то криво данные отправляете. Покажите в отладчике, что вы отправляете и что приходит
0
91 / 86 / 12
Регистрация: 08.08.2013
Сообщений: 667
11.09.2016, 13:56  [ТС]
turbanoff,

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
@Override
    public Response serve(IHTTPSession session) {
        debugLog("Запрос " + session.getQueryParameterString() + " " + session.getRemoteHostName() + " " + session.getRemoteIpAddress() + " " + session.getUri());
 
        InputStream mbuffer = null;
        switch (session.getUri()){
            case "/":
                return newFixedLengthResponse("" +
                        "<html>" +
                        "<script type="text/javascript" src="jquery-3.1.0.min.js"></script>" +
                        "<body>" +
                        "<input type="button" value="Кнопка" style="width:150px;height:30px" onclick="getJS()"/>" +
                        "<script>" +
                        "function getJS(){" +
                            "$.ajax({" +
                                "type: "POST"," +
                                "url: "Data.php"," +
                                "data: {" +
                                "'prm1':'Params'" +
                                "}," +
                                "success: function(data) {" +
                                    "alert('ajax ВЫПОЛНЕН !!! ' + data)" +
                                "}," +
                                "error:function(){" +
                                    "alert('Ошибка получения AJAX');" +
                                "}" +
                            "});" +
                        "}" +
                        "</script>" +
                        "</body></html>");
            case "/jquery-3.1.0.min.js":
                try {
                    mbuffer = mb.getAssets().open("web/jquery-3.1.0.min.js");
                } catch (IOException e) {
                    debugLog("ERROR. не могу получить myScript.js из assets " + e.getMessage());
                }
                try {
                    return newFixedLengthResponse(Response.Status.OK, MIME_JS, mbuffer, mbuffer.available());
                } catch (IOException e) {
                    debugLog(e.getMessage());
                }
            case "/Data.php":
                debugLog("запрос /Data.php ");
                String msg = "Всё ОК";
                return newFixedLengthResponse(NanoHTTPD.Response.Status.OK, MIME_PLAINTEXT, msg);
            default:
                return newFixedLengthResponse(Response.Status.NOT_FOUND,"","");
        }
    }
На Data.php не обращайте внимание.

При запросе отдаю html и jquery-3.1.0.min.js
При получении запроса /Data.php - ajax с нажатия кнопки отдаю текст и в браузере показываю alert с этим текстом, иначе ошибка с alert.

Лог nanohttpd

09-11 13:52:55.525 11268-12602/? D/scream﹕ [WebServer] Запрос null 192.168.5.61 192.168.5.61 /
09-11 13:52:56.052 11268-12602/? D/scream﹕ [WebServer] Запрос null 192.168.5.61 192.168.5.61 /jquery-3.1.0.min.js
09-11 13:52:57.355 11268-12602/? D/scream﹕ [WebServer] Запрос null 192.168.5.61 192.168.5.61 /Data.php //Это первый запрос
09-11 13:52:57.355 11268-12602/? D/scream﹕ [WebServer] запрос /Data.php //Это первый запрос
09-11 13:52:59.712 11268-12603/? D/scream﹕ [WebServer] Запрос null 192.168.5.61 192.168.5.61 /Data.php //Это третий запрос
09-11 13:52:59.712 11268-12603/? D/scream﹕ [WebServer] запрос /Data.php //Это третий запрос

тоесть BAD REQUEST отдаёт сам nanohttpd, а не я, мне тут он ничего не сообщает об этом.
Лог firebug приложил на скрине
Миниатюры
NanoHttpd и ajax BAD REQUEST  
0
91 / 86 / 12
Регистрация: 08.08.2013
Сообщений: 667
11.09.2016, 19:28  [ТС]
turbanoff, совсем нет никаких идей?
Где то читал что нужно обязательно забрать все POST данные, но как забрать хз, там list упакованный в map со string.
Везде в интернете старые реализации.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
11.09.2016, 23:05
_Night_Scream_, надо дебажить код самого NanoHttpd, смотреть. Найдите место, где он возвращает эту ошибку
0
91 / 86 / 12
Регистрация: 08.08.2013
Сообщений: 667
11.09.2016, 23:09  [ТС]
turbanoff, да, наверное... один нерусь на stackoverflow писал что обошел эту ошибку только изменив исходники, ему ничего не ответили.
Еще денёк подожду ответ от автора библиотеки и тогда займусь исходниками.
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
11.09.2016, 23:28
org.nanohttpd.protocols.http.HTTPSession .java:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
// Decode the header into parms and header java properties
            Map<String, String> pre = new HashMap<String, String>();
            decodeHeader(hin, pre, this.parms, this.headers);
 
            if (null != this.remoteIp) {
                this.headers.put("remote-addr", this.remoteIp);
                this.headers.put("http-client-ip", this.remoteIp);
            }
 
            this.method = Method.lookup(pre.get("method"));
            if (this.method == null) {
                throw new ResponseException(Status.BAD_REQUEST, "BAD REQUEST: Syntax error. HTTP verb " + pre.get("method") + " unhandled.");
            }
2
91 / 86 / 12
Регистрация: 08.08.2013
Сообщений: 667
12.09.2016, 14:30  [ТС]
Что-то с header'ами походу.

Добавлено через 14 часов 10 минут
Дело двинулось.
Здесь я задал автору вопрос https://github.com/NanoHttpd/nanohttpd/issues/373
Возможно это связано с невыполнением метода parseBody().
0
91 / 86 / 12
Регистрация: 08.08.2013
Сообщений: 667
16.09.2016, 10:12  [ТС]
В общем да, это баг.
Надо отслеживать метод и если это POST или PUT, то нужно вызвать parseBody().

---
не хочу тему еще создавать, суть та же, почти
я хочу через ajax отдавать картинку с андроида, но дело в том что она должна сгенериться (скриншот) а это отнимает довольно много времени (~1 сек), но nanohttpd СРАЗУ (10ms) рвёт соединение.
ТУТ я задал разрабу вопрос, но он меня за нос водит, ничего толкового не говорит, или я ошибаюсь?
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
16.09.2016, 13:06
_Night_Scream_, ты делаешь скриншот и постишь его на сервер?
0
91 / 86 / 12
Регистрация: 08.08.2013
Сообщений: 667
16.09.2016, 13:32  [ТС]
LeX BB, да, по запросу.
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
16.09.2016, 13:33
_Night_Scream_, т.е. сервер делает запрос и в ответ идет скриншот?
0
91 / 86 / 12
Регистрация: 08.08.2013
Сообщений: 667
16.09.2016, 13:51  [ТС]
LeX BB, не севрер, клиент - браузер обычный.
Смысл в том чтобы пользователь мог посмотреть скрин с любого устройства через браузер, там еще будет пара кнопок управления.
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
16.09.2016, 13:59
_Night_Scream_, ничего не пойму, расскажи последовательность действий с описанием кто что инициирует (пользовательское действие, запрос с сервера)
0
91 / 86 / 12
Регистрация: 08.08.2013
Сообщений: 667
16.09.2016, 14:03  [ТС]
LeX BB, на андроид устройстве поднят web сервер с помощью nanoHttpd.
Такой, карманный WEB сервер получился.
При GET запросе андроид делает скриншот и отдаёт браузеру, так вот nanoHttpd не отдаёт скрин, весьма долго этот скрин обрабатывается (~1сек).
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
16.09.2016, 14:04
_Night_Scream_, т.е. ты делаешь запрос потом делаешь скриншот и отправляешь?
0
91 / 86 / 12
Регистрация: 08.08.2013
Сообщений: 667
16.09.2016, 14:05  [ТС]
LeX BB, да, верно.
Хотел обновлять раз в секунд 5 через аякс скрин с телефона.
Пока просто GET делаю, аякс пока не трогаю.
Если отдавать статическую картинку, лежащую в проекте, то норм, а если её генерить, то обрыв связи.
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
16.09.2016, 14:07
_Night_Scream_, так сделай скрин, а потом уже открывай соединение.

это как минимум, думаю поможет. если нет, то уже копаться во всяких настройках
0
91 / 86 / 12
Регистрация: 08.08.2013
Сообщений: 667
16.09.2016, 14:11  [ТС]
LeX BB,
Вот код скриншота

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Override
    public Response serve(IHTTPSession session) {
        switch (session.getUri()){
            case "/capture2.jpg":
                debugLog("case /capture2.jpg:");// ЭТОТ ЛОГ ВЫВОДИТСЯ
                // ---- Here, I need a little time
                ByteArrayOutputStream bos2 = new ByteArrayOutputStream();
                mbCanvas.testLayout.setDrawingCacheEnabled(true);
                mbCanvas.testLayout.getDrawingCache().compress(Bitmap.CompressFormat.PNG, 0, bos2);
                mbCanvas.testLayout.setDrawingCacheEnabled(false);
                byte[] bitmapData2 = bos2.toByteArray();
                ByteArrayInputStream bs2 = new ByteArrayInputStream(bitmapData2);
                debugLog("RETURN");// А ЭТОТ НИКОГДА НЕ ВЫВОДИТСЯ
                return newFixedLengthResponse(Response.Status.OK, "image/jpeg", bs2, bs2.available());
        }
    }
Добавлено через 1 минуту
LeX BB, сделать скрин надо на устройстве тогда, когда пришел запрос, заранее не могу сделать, данные будут не актуальные, ведь я не знаю когда он попросит заранее.
Браузер попросил, андроид отдал то, что на экране.
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
16.09.2016, 14:12
_Night_Scream_, а, так ты с серверным приложением скриншот делаешь?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.09.2016, 14:12
Помогаю со студенческими работами здесь

400 Bad request
Когда пытаюсь получить инфу с сайта, получаю 400 Bad Request, что делать?? Срочно, прошу!! #pragma optimize(&quot;t&quot;,on) ...

400 Bad Request
Ребят, помогите советом, пожалуйста. я уже устала... Проблема: При попытке воспользоваться Yandex-поиском вылезает: Bad Request ...

Core 1.1 bad request
У меня какая-то не понятная проблема создал дефолтный asp.net core 1.1 web api проект нечего в нём не менял и нажал &quot;старт с...

400 Bad Request
Использую socket подключаюсь к php серверу. Выдаёт 400 Bad Request. import socket class _database(): def...

SSL 400 Bad Request
Помогите разобраться с проблемой выше. Сделал все по статье &quot;Авторизация клиентов в nginx посредством SSL сертификатов&quot;, вроде уже...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru