Тело запроса меньше отправленного клиентом - HttpServer Java - PullRequest
0 голосов
/ 16 сентября 2018

Я создаю Java-приложение, используя HttpServer, как показано ниже:

public class Application 
{
public static void main(String args[])
{
    HttpServer httpPaymentServer;
    httpPaymentServer = HttpServer.create(new InetSocketAddress(Config.portPayment), 0);
    httpPaymentServer.createContext("/json", new Payment("json"));
}
public class Payment implements HttpHandler
{
    public Payment(String dataType)
    {
    }
    public void handle(HttpExchange httpExchange) throws IOException 
    { 
        String body = "";
        if(httpExchange.getRequestMethod().equalsIgnoreCase("POST")) 
        {
            try 
            {
                Headers requestHeaders = httpExchange.getRequestHeaders();
                Set<Map.Entry<String, List<String>>> entries = requestHeaders.entrySet();
                int contentLength = Integer.parseInt(requestHeaders.getFirst("Content-length"));
                InputStream inputStream = httpExchange.getRequestBody();
                byte[] postData = new byte[contentLength];
                int length = inputStream.read(postData, 0, contentLength);
                if(length < contentLength)
                {                   
                }
                else
                {
                    String fullBody = new String(postData);                 
                    Map<String, String> query = Utility.splitQuery(fullBody);
                    body = query.getOrDefault("data", "").toString();
                }
            } 
            catch (Exception e) 
            {
                e.printStackTrace(); 
            }    
        }
    }
}
}

На моем сервере (Centos 7) по первому запросу это не проблема.Но при следующем запросе не все тело запроса может быть прочитано.Но на моем ПК (Windows 10) проблем нет.В чем проблема.

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Спасибо.Эта работа для меня

public void handle(HttpExchange httpExchange) throws IOException 
{
    String body = "";
    if(httpExchange.getRequestMethod().equalsIgnoreCase("POST")) 
    {
        try 
        {
            Headers requestHeaders = httpExchange.getRequestHeaders();
            Set<Map.Entry<String, List<String>>> entries = requestHeaders.entrySet();
            int contentLength = Integer.parseInt(requestHeaders.getFirst("Content-length"));
            InputStream inputStream = httpExchange.getRequestBody();             
            int j;
            String fullBody = "";
            for(j = 0; j < contentLength; j++)
            {
                byte b = (byte) httpExchange.getRequestBody().read();
                fullBody += String.format("%c", b);
            }
            Map<String, String> query = Utility.splitQuery(fullBody);
            body = query.getOrDefault("data", "").toString();
        } 
        catch (Exception e) 
        {
            e.printStackTrace(); 
        }
    }
}
0 голосов
/ 16 сентября 2018

Для вашего InputStream вы звоните read только один раз - он может не вернуть все данные. Эти данные могут даже не быть получены в это время.

Вместо этого вы должны вызывать read в цикле, пока не получите все байты (когда вы достигнете конца потока read вернет -1). Или используйте один из предложенных здесь подходов Как читать / преобразовывать InputStream в строку в Java?

...