Способы проверки запроса HTTP в Java? - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь проверить HTTP-запрос на моем сервере. Http-клиент может отправлять мне разные запросы о том, что некоторые из них могут не соответствовать моему серверу, поэтому в этом случае я должен отправить клиенту ответ, что с запросом что-то не так.

Прежде чем продолжить чтение, учтите, что изменение порядка имен полей не повлияет на ответ. Так что порядок полей не имеет значения.

Например: это законный запрос:

POST http://localhost HTTP/1.1
HOST: (here is an IP adress)
Content-Length: 50
Connection: Close
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
User_Id = 123456
Item_Id = 5007
Color = 1010

(ПРИМЕЧАНИЕ: запрос будет законным, если он имел только имена этих полей, если он содержит какие-либо другие имена полей, он будет указан как недопустимый)

И поскольку это действительный запрос, мой сервер отправит 200 OK в качестве ответа следующим образом:

HTTP/1.1 200 OK
Connection: Close
Payment: 2755201

Но, например, если запрос имел ложное значение полей или неизвестное поле, как показано ниже: Неверное значение User_Id:

POST http://localhost HTTP/1.1
HOST: (here is an IP adress)
Content-Length: 50
Connection: Close
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
User_Id = -2323
Item_Id = 5007
Color = 1010

Ответ будет:

HTTP/1.1 200 OK
Connection: Close
Error_ID: 602
Error_String: Error in user_Id (illegal user ID)

Или неизвестное имя поля:

POST http://localhost HTTP/1.1
HOST: (here is an IP adress)
Content-Length: 50
Connection: Close
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
User_Id = 123456
Item_Id = 5007
Sale = 0.5
Color = 1010

Ответ будет:

HTTP/1.1 200 OK
Connection: Close
Error_ID: 602
Error_String: Sale , unknown field name

В качестве способа проверки я подумал о том, чтобы поместить все допустимые имена полей в перечисление, и когда я получаю запрос, я анализирую их на основе этого перечисления, но у меня есть больше допустимых полей (не только user_Id, item_Id и color), поэтому применяю этот способ может занять много времени и может быть неэффективным, особенно потому, что порядок полей не имеет значения.

это мой код сервера:

@Test
    public void main() throws IOException
    {
        serverSocket = new ServerSocket(80);
        Socket clnt = null;
        while (true)
        {
            clnt = serverSocket.accept();
            System.out.println("after accept in server");
            BufferedReader request = new BufferedReader(new InputStreamReader(clnt.getInputStream()));
            BufferedWriter response = new BufferedWriter(new OutputStreamWriter(clnt.getOutputStream()));

            String req = ".", strReq = "";
            try
            {
                req=request.readLine();
                while (!req.equals(""))
                {
                    System.out.println(req);
                    strReq += (req + "\n");
                    req=request.readLine();
                }
            }
            catch (Exception e)
            {
                // TODO: handle exception
                e.printStackTrace();
                System.out.println("xxxx");
            }
            System.out.println(strReq);
            String httpResponse = "HTTP/1.1 200 OK\r\n";
            //here will be the rest of the response
            response.write(httpResponse);
            System.out.println(httpResponse);
            response.flush();
        }
    }

Я новичок в http, поэтому, если есть какая-нибудь библиотека валидации или какой-либо другой более эффективный способ валидации, я буду благодарен, если вы сможете предложить.

1 Ответ

0 голосов
/ 28 августа 2018

Используйте Spring MVC контроллер. Это делает вашу жизнь проще. Проверка будет проведена автоматически. Например

  @RequestMapping(value = "user", method = RequestMethod.POST) 
  public Response addUser(@RequestBody @Valid User user) {
    return userService.addUser(user);
  }

public class User implements Serializable {

private Long id;
@NotNull
@NotEmpty
private String userName;
@NotNull
@NotEmpty
private String password;
@NotNull
@NotEmpty
private String firstName;
private String lastName;

//all getters and setters here

}
@ControllerAdvice
@RestController
public class GlobalExceptionController {

 @ExceptionHandler({Exception.class})
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public  Response handleBadRequest(Exception ex) {
    Response response = new Response();
    response.setStatus(HttpStatus.BAD_REQUEST.value());
    response.setMessage(ex.getMessage());
    return response;
}
}

Все проверки будут выполняться аннотацией @Valid. Исключение может быть обработано, если необходимо, в Spring Global Exception controller

...