Форум программистов, компьютерный форум, киберфорум
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
3 / 3 / 3
Регистрация: 11.03.2017
Сообщений: 37

HttpServletRequest параметры есть а getQueryString пустой

18.05.2018, 00:53. Показов 1676. Ответов 2

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Столкнулся с таким вот косячком. Работаю с api стороннего сервиса, предоставляющего оплату криптой. При оплате на моем сайте, на сервер прилетает уведомление (на контроллер, который я указал). Чтобы проверить его подлинность, мне необходимо достать, ВНИМАНИЕ - "Необработанные POST-данные", и получить на их основе хеш с помощью ключа. Я полазил по гуглу, узнал, что в пхп есть для этого некий метод - "$HTTP_RAW_POST_DATA". Нашел метод HttpServletRequest.getQueryString(). Протестил этот метод на своем localhost:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@RequestMapping(value = "/startCampaign")
    public void startCampaign(HttpServletRequest request, HttpServletResponse resp) throws IOException {
        request.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("application/json");
 
        System.out.println("getQueryString - " + request.getQueryString());
 
        PrintWriter out = resp.getWriter();
        JSONObject job = new JSONObject();
        job.put("scStatus", "failed");
 
        out.print(job);
 
        out.close();
        job = null;
        out = null;
    }
В выводе получил:

JSON
1
campaignName=someName&userName=someUserName&count=56
Все супер. Сервис для уведомлений при оплате просит отправлять ему callback-Url, на который собсна и будет прилетать уведомления со всеми данными об оплате. Я на странице генерю URL с параметром id юзера:

JSON
1
http://localhost:8080/getPayment?id=2
На этот URL уведомление прилетает, и я получаю id юзера и все добавленные сервисом данные. НО! эти данные я могу получить только через request.getParameter("someParameter"), а вот если я прошу request.getQueryString() - то получаю только тот id который я сгенерил изначально.

Вот собственно обработчик уведомления:

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
@RequestMapping(value = {"/getPayment"})
    @SuppressWarnings("unchecked")
    @ResponseBody
    public void getPayment(HttpServletRequest request) throws IOException {
        request.setCharacterEncoding("UTF-8");
 
        log.error("\nQUERY_STRING - " + request.getQueryString());
        log.error("\nURI - " + request.getRequestURI());
        log.error("\nURL - " + request.getRequestURL());
 
        StringBuilder stringBuilder = new StringBuilder();
        StringBuilder stringBuilder1 = new StringBuilder(); 
 
        Enumeration<String> params = request.getParameterNames();
        Enumeration<String> headers = request.getHeaderNames();
 
        String paramsName;
        while (params.hasMoreElements()) {
            paramsName = params.nextElement();
 
            stringBuilder.append("\nNAME - ");
            stringBuilder.append(paramsName);
            stringBuilder.append("; PARAMETER - ");
            stringBuilder.append(request.getParameter(paramsName));
        }
 
        String headersName;
        while (headers.hasMoreElements()) {
            headersName = headers.nextElement();
 
            stringBuilder1.append("\nH-NAME - ");
            stringBuilder1.append(headersName);
            stringBuilder1.append("; H-PARAMETER - ");
            stringBuilder1.append(request.getHeader(headersName));
        }
 
        log.error("\n\nGET_PAYMENT: " + LocalTime.now().toString() + "\n" + stringBuilder.toString());
        log.error("\nheader-parameters:\n" + stringBuilder1.toString());
        
        stringBuilder = null;
        params = null;
    }
Ну и то, что я получаю в логах:

JSON
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
QUERY_STRING - id=2
URI - /getPayment
URL - http://my-syte.com/getPayment>
 
GET_PAYMENT: 21:17:03.565
 
NAME - id; PARAMETER - 2
NAME - ipn_version; PARAMETER - 1.0
NAME - ipn_id; PARAMETER - f0d55d4013f496e3e610a37d5c23sqwwb562
NAME - ipn_mode; PARAMETER - hmac
NAME - merchant; PARAMETER - ef893429cd11d669af449f7fc8esa5c129ceb3
NAME - ipn_type; PARAMETER - simple
NAME - txn_id; PARAMETER - CPCE13DTFHIM16DFKRHGADADKY7HP8
NAME - status; PARAMETER - 0
NAME - status_text; PARAMETER - Waiting for buyer funds...
NAME - currency1; PARAMETER - USD
NAME - currency2; PARAMETER - ETH
NAME - amount1; PARAMETER - 220
NAME - amount2; PARAMETER - 0.31983
NAME - subtotal; PARAMETER - 220
NAME - shipping; PARAMETER - 0
NAME - tax; PARAMETER - 0
NAME - fee; PARAMETER - 0.0016
NAME - item_amount; PARAMETER - 220
NAME - item_name; PARAMETER - 4 month access
NAME - first_name; PARAMETER - iiiiiiii1
NAME - last_name; PARAMETER - ssssss1
NAME - email; PARAMETER - evgenii-onegin91@mail.ru
NAME - received_amount; PARAMETER - 0
NAME - received_confirms; PARAMETER - 0
 
 
header-parameters:
 
H-NAME - connection; H-PARAMETER - upgrade
H-NAME - host; H-PARAMETER - the-twist-tests.mycloud.by
H-NAME - content-length; H-PARAMETER - 457
H-NAME - x-forwarded-proto; H-PARAMETER - http
H-NAME - x-real-ip; H-PARAMETER - 149.56.241.110
H-NAME - x-remote-port; H-PARAMETER - 32823
H-NAME - x-forwarded-for; H-PARAMETER - 149.56.241.110
H-NAME - x-host; H-PARAMETER - the-twist-tests.mycloud.by
H-NAME - https-enabled; H-PARAMETER - false
H-NAME - user-agent; H-PARAMETER - CoinPayments.net IPN Generator
H-NAME - accept; H-PARAMETER - */*
H-NAME - hmac; H-PARAMETER - fc091f7d3191e9a36cef14b30885a6afd4126ad51d016cab35881605a82948d799a78bfccb3b1e63e0ac0b21a73b91bc8bfd08bg4959770b3a2a40f33b88709d805a
H-NAME - content-type; H-PARAMETER - application/x-www-form-urlencoded>
Обратите внимание, что QUERY_STRING - id=2, а если доставать через getParameter, то оказывается, что getQueryString должна быть куда "содержательнее" чем просто "id=2". Соответственно hmac (хеш) который они мне присылают основан на вышеперечисленных необработанных POST-данных, а я в таком виде могу достать только id=2. Ну и как следствие - их хеш != моему

Очень надеюсь на вашу помощь, ибо тестовый период хостинга скоро заканчивается, а я до сих пор не могу с оплатой справится
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.05.2018, 00:53
Ответы с готовыми решениями:

Пустой конструктор: есть ли разница
Есть ли существенная разница между следующими вариантами? #1 MyClass() : this(0,0) MyClass(int a, int b) { this.a = a; this.b =...

почему $_FILES пустой, но в $_REQUEST есть значение
форма &lt;form enctype=&quot;multipart/form-data&quot; action=&quot;fileUpload&quot; method=&quot;get&quot;&gt; &lt;input type=&quot;hidden&quot; name=&quot;_token&quot; value=&quot;{{...

Как замокать HttpServletRequest?
как замокать HttpServletRequest? есть метод в который передается request. юнит тестирование, как я понимаю, для того и предназначено...

2
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
18.05.2018, 08:22
Цитата Сообщение от POSTAL5532 Посмотреть сообщение
"$HTTP_RAW_POST_DATA"
возвращает тело POST запроса
Цитата Сообщение от POSTAL5532 Посмотреть сообщение
getParameter
возвращает параметр запроса, который может быть получен в том числе и из form-data формата тела запроса - это у тебя и происходит. тебе надо получить тело запроса полностью, например так:
Java
1
2
3
4
@RequestMapping(value = {"/getPayment"})
@SuppressWarnings("unchecked")
@ResponseBody
public void getPayment(HttpServletRequest request, @RequestBody String body) throws IOException {
1
3 / 3 / 3
Регистрация: 11.03.2017
Сообщений: 37
18.05.2018, 13:38  [ТС]
LeX, спасибо за ответ, я уже достал данные в нужном формате такой конструкцией:
Java
1
request.getReader().lines().collect(Collectors.joining(System.lineSeparator()))
Вернул мне:
JSON
1
ipn_version=1.0&ipn_id=62b811b04b28sd69h3e3d447568d2821&ipn_mode=hmac&merchant=ef89421gh7d459af449f7fc8e5c9ceb3&ipn_type=simple&txn_id=CPCE3EPCSUEYIUFII4B3ZENGC4&status=-1&status_text=Cancelled+%2F+Timed+Out&currency1=USD&currency2=BTC&amount1=50&amount2=0.0061&subtotal=50&shipping=0&tax=0&fee=3.0E-5&item_amount=50&item_name=1+month+access&first_name=Igor1&last_name=Shcherb1&email=evgenii-onegin91%40mail.ru&received_amount=0&received_confirms=0
Не залазил ни разу в разбор реквестов. Всегда было достаточно getParameter. А тут прям из этих данных хеш тянуть для проверки. Понял что мои познания в области http протокола, post, get, разбор URL и т.д. весьма поверхностны.

Добавлено через 52 минуты
LeX, задеплоил с Вашим вариантом получения тела запроса - наиболее удобный и информативный. Буду читать спринг) Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.05.2018, 13:38
Помогаю со студенческими работами здесь

Отличие ServletRequest и ServletResponse, от HttpServletRequest и HttpServletResponse
Кратко то, что я узнал... Сервлеты обладают 3-мя элементами: Интерфейс Servlet, который описывает жизненный цикл сервлета. ...

Проблема с методом getRemoteUser() (класс HttpServletRequest)
Всем добрый день. Я думаю что проблема должна быть знакомой. В общем вопрос в следующем: Как заставить эту функцию возвращать не null...

Как связаны HttpServletRequest & ModelMap?
Мне интересно как эти два класса повязаны. Походу request.getSession.setAttribute(...) должно быть то же, что и model.addAtribute(...)....

Пустой оператор есть во всех функциях и методах классов: кто против?
while{1} ;

Сощдание прослойки для обработки HttpServletRequest request
Здравствуйте. Имеется набор методов которые работают с параметрами, арибутами request - говорят передавать request куда попало не есть...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru