Обработка запросов POST с удаленного веб-сайта/Sigfox с помощью Jetty 9.4.1

Я новичок в Jetty и работе в сети с Java, поэтому, пожалуйста, ответьте на мои вопросы и вопросы новичков.

Что я хочу сделать, так это обработать полезную нагрузку, отправленную из Sigfox в формате application/x-www-form-urlencoded, то есть данные будут поступать как "device={device}&data={data }&time={время".

Я узнал, что на самом деле могу сделать обратный вызов Sigfox на сервер приложений Java. Поправьте меня, если я ошибаюсь, но я думал, что сервлет может служить той же цели? Вот почему я решил встроить Jetty в свое Java-приложение (я использую последнюю версию Jetty 9.4.1).

Следуя учебнику Embedded Jetty, я сделал эту программу:

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import java.net.InetSocketAddress;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletHandler;

public class MinimalServlets
{
    public static void main( String[] args ) throws Exception
    {
        // Create a basic jetty server object that will listen on port 9081.
        // Note that if you set this to port 0 then a randomly available port
        // will be assigned that you can either look in the logs for the port,
        // or programmatically obtain it for use in test cases.
        Server server = new Server(new InetSocketAddress("MY_IP", 9081));

        // The ServletHandler is a dead simple way to create a context handler
        // that is backed by an instance of a Servlet.
        // This handler then needs to be registered with the Server object.
        ServletHandler handler = new ServletHandler();
        server.setHandler(handler);

        // Passing in the class for the Servlet allows jetty to instantiate an
        // instance of that Servlet and mount it on a given context path.

        // IMPORTANT:
        // This is a raw Servlet, not a Servlet that has been configured
        // through a web.xml @WebServlet annotation, or anything similar.
        handler.addServletWithMapping(HelloServlet.class, "/*");

        // Start things up!
        server.start();

        // The use of server.join() the will make the current thread join and
        // wait until the server is done executing.
        // See
        // http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#join()
        server.join();
    }

    @SuppressWarnings("serial")
    public static class HelloServlet extends HttpServlet
    {
        @Override
        protected void doGet( HttpServletRequest request,
                              HttpServletResponse response ) throws ServletException,
                                                            IOException
        {
            response.setContentType("text/html");
            response.setStatus(HttpServletResponse.SC_OK);
            response.getWriter().println("<h1>Hello from HelloServlet</h1>");
            
//            System.out.println("\nConnected");
//    		System.out.println(request.getParameter("data"));

        }
        
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
        {
            // Get POST parameters
            String val = req.getParameter("data");
            System.out.println(val);    //print value of 'data'
            // Write a response
            resp.setContentType("text/html");
            resp.setCharacterEncoding("UTF-8");
            resp.setStatus(HttpServletResponse.SC_OK);  //respond with "200"          
            resp.getWriter().printf("data = %s",val);
        }
    }
}

Однако он не получает полезную нагрузку от Sigfox и не отвечает «200». На стороне Sigfox пишет, что «время ожидания соединения истекло»:

Скриншот ошибки обратного вызова

Из моего чтения архитектуры Jetty HttpServlet и ServletHandler - правильный путь? Итак, где я ошибаюсь в своем понимании и коде?

Заранее спасибо!


person S.K    schedule 15.02.2017    source источник
comment
Если не считать данные из HttpServletRequest, остальное выглядит вполне нормально. Возможно, есть какой-то вывод журнала Jetty, который говорит вам, что происходит.   -  person Joakim Erdfelt    schedule 16.02.2017
comment
@JoakimErdfelt единственный вывод, который я получаю на консоли eclipse, когда запускаю эту программу: 2017-02-16 12:50:46.528:INFO::main: Ведение журнала инициализировано в знаке*7037ms для org.eclipse.jetty. util.log.StdErrLog 2017-02-16 12:50:47.891:INFO:oejs.Server:main: jetty-9.4.z-SNAPSHOT 2017-02-16 12:50:48.893:INFO:oejs.AbstractConnector:main: Запущен ServerConnectorпо знаку *1f89fa3{HTTP/1.1,[http/1.1]}{HOSTNAME.internal.local:9081} 2017-02-16 12:50:48.894:INFO:oejs.Server:main: запущен *под знаком*9587мс   -  person S.K    schedule 16.02.2017
comment
Если я прав, метод doPost() должен обрабатывать POST-запросы, поступающие от Sigfox, верно? Если я закомментирую метод doGet() так, чтобы остался только doPost(), я получаю сообщение об ошибке на своем URL-адресе: ОШИБКА HTTP 405 Проблема с доступом к /. Причина: HTTP-метод GET не поддерживается этим URL-адресом.   -  person S.K    schedule 16.02.2017
comment
Имеет ли значение, что Sigfox — это HTTPS? Может ли он по-прежнему отправлять полезные данные на мой HTTP-сервер?   -  person S.K    schedule 16.02.2017
comment
Это похоже на то, что я хочу сделать, но не в коде json, а в обычном x-www-form-urlencoded. В настоящее время мой doGet выполняется вместо моего doPost. doGet также говорит, что запрос исходит от /favicon.io??? Как это исправить?   -  person S.K    schedule 21.02.2017