How to send both object and parameters in postman? - java

I want to send an object of arraylist(in java) and other parameters as passed by the user to postman.
Here is my Code for controller
#PostMapping(path = "/listEmpPaidSalariesPaged", produces = "application/json")
public List<EmployeeSalaryPayment> listEmpPaidSalariesPaged
(long SID, Collection<Student> student, String orderBy,
int limit, int offset)
I know you can use RAW data and JSON for object
and x-www-form-urlencoded for parameters, but how to send them together?

You can use #RequestBody and #RequestParam annotations, like for example:
#PostMapping(path = "/listEmpPaidSalariesPaged", produces = "application/json")
public List<EmployeeSalaryPayment> listEmpPaidSalariesPaged(#RequestBody StudentRequestModel studentRequestModel, #RequestParam(value = "orderBy", defaultValue = "descending") String orderBy, #RequestParam(value = "limit", defaultValue = "25") int limit, #RequestParam(value = "offset", defaultValue = "0") int offset) {
// controller code
}
#RequestBody will automatically deserialize the HttpRequest body (raw JSON from postman) into a java object (StudentRequestModel).
#RequestParam will extract your query parameters (in postman you can do a POST to /listEmpPaidSalariesPaged?orderBy=ascending for example) into the defined variables.
You can do both at the same time of course in postman.

Related

How Do I Mark A RequestParam As Optional In Swagger?

I am generating the swagger docs for my REST API using SpringFox.
I have added an optional parameter to my API now:
#ApiOperation(
value = "Get all cars"
)
#GetMapping(value = "/cars", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ResponseDTO<CarDTO>> getCars(
#RequestParam(defaultValue = "1") Integer page,
#RequestParam(required = false) String status) {
ResponseDTO<CarDTO> response = service.getCars(page, status);
return ResponseEntity.ok(response);
}
How do I highlight in the swagger docs that one is required and the other is optional?
You have the #ApiParam annotation you can use, it has a property required which you can put to true or false depending on your needs
#ApiOperation(
value = "Get all cars"
)
#GetMapping(value = "/cars", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ResponseDTO<CarDTO>> getCars(
#ApiParam(required = true) #RequestParam(defaultValue = "1") Integer page,
#ApiParam(required = false) #RequestParam(required = false) String status) {
ResponseDTO<CarDTO> response = service.getCars(page, status);
return ResponseEntity.ok(response);
}
As you can see in the documentation, it has other properties like
access
allowableValues
allowMultiple
defaultValue
name
value

Send value from Front To Back without changing java methods signature (springboot)

I need to send a value from an Angularjs front to a springboot Java back-office.
The back is called by many other fronts and services.
Which means I can change The front but I have to make sure that any change on the back must not break it for the other callers.
So Extra headers or Other fields in the request body etc... any change that won't break the other existing calls is what I'm looking for.
An example of some methods signature:
A HTTP GET signature
#Override
#ResponseStatus(code = HttpStatus.OK)
#RequestMapping(value = "/", method = RequestMethod.GET)
public ResponseEntity<List<Something>> getSomething(
#RequestHeader(name = Constants.HEADER.SOME_CODE) final String code,
#RequestHeader(name = Constants.HEADER.COMPANY_ID) final String companyId,
#RequestHeader(name = Constants.HEADER.CLIENT_ID) final String clientId) {
A HTTP POST signature
#Override
#ResponseStatus(code = HttpStatus.OK)
#RequestMapping(value = "/{pathValue}/transactions", method = RequestMethod.POST)
public ResponseEntity<SomeResponse> requestSomething(
#RequestHeader(name = Constants.HEADER.EFS_CODE) final String vode,
#RequestHeader(name = Constants.HEADER.COMPANY_ID) final String companyId,
#RequestHeader(name = "Access-Code", required = false) final String codeAcces,
#RequestHeader(name = Constants.HEADER.CLIENT_ID) final String clientId,
#PathVariable("pathValue") final String pathValue,
#RequestBody #Valid Transact transaction) {

Spring not catch all object of my rest petition

My method is this:
#RequestMapping(value = "/asignar", method = RequestMethod.GET, headers = "Accept=application/json")
public #ResponseBody
ResponseViewEntity<ResultadoJSON> asignar(
#RequestParam(required = true, value = "usuario") String usuario,
#RequestParam(required = true, value = "clienteId") Long clienteId,
ListaLotes lotes) {
....
}
Object ListaLotes
public class ListaLotes {
private List<LoteForm> lotes;
}
Object LoteForm
public class LoteForm {
private Long loteId;
private Long cantidad;
}
But when i realize the petition throught PostMan, the object "lotes" its always null
PETITION REST
Rest Header
Rest body
What I should do for it works ? I can't modify my Java code its part of an API. Only can modify de REST Petition
As has already been commented, if you want to transfer data to your controller, you need to use the POST method and mark the paramter as #RequestBody.
// or #PostMapping
#RequestMapping(value = "/asignar", method = RequestMethod.POST, headers = "Accept=application/json")
public #ResponseBody
ResponseViewEntity<ResultadoJSON> asignar(
#RequestParam(required = true, value = "usuario") String usuario,
#RequestParam(required = true, value = "clienteId") Long clienteId,
#RequestBody ListaLotes lotes) {
....
}

Spring Boot URL Length Validation

For security reasons, I need to return a 400 error if the URI request length is greater than 1024 characters in length.
Is there a way to test this in Spring Boot?
Currently I have a simple Controller doing validation on the query string and header params
#RestController
#Validated
public class myController {
#RequestMapping(value = "{id}", method = GET)
public SegmentationResponse getSegments(
#PathVariable("id") #Valid #Size(min = 12) String id,
#RequestHeader(value = "X-API-Key", required = true) #ValidAPIKey String apiKeyHeader,
#RequestParam(value = "myParam", required = true) #Valid #Pattern(regexp = MY_REGEX) String myParam) {
// DO Stuff
}
}
Desired
http://localhost:8080/<More than 1024 chars here>
Returns 400 Bad Request

Spring Boot passing JSON and simple attributes to the same mapping

I'm new in Spring Boot and I want to have the same Request Mapping method for JSON and simple request params, for example:
#RequestMapping(value = "/start")
public String startPostProcess(#RequestParam(value = "url",
required = false,
defaultValue = "https://goo.gl") String url,
#RequestParam(value = "word",
required = false,
defaultValue = "Search") String word,
#RequestBody String hereGoesJSON) {
//Do some stuff
}
So, when request goes with params, only #RequestParam will work, in other cases we will use #RequestBody annotation.
localhost:8080/start?url=htts://google.com&word=Luck
Or may bee I'll be able to write method like this, for accepting any params:
#RequestMapping(value = "/start")
public String startPostProcess(#RequestBody String anyParam) {
//Parse this anyParam
}
?
I've not found this trick in spring documentation, so I will appreciate any links to it.
Okay, I've solved the problem :D
All that I just needed was 2 methods with the same mapping and explicitly specify RequestMethod type:
#RequestMapping(value = "/start")
public String startPostProcess(#RequestParam(value = "url",
required = false,
defaultValue = "https://goo.gl") String url,
#RequestParam(value = "word",
required = false,
defaultValue = "Search") String word) throws InterruptedException {
//Do some stuff
}
#RequestMapping(value = "/start", method = RequestMethod.POST, consumes = "application/json")
public String startJsonProcess(#RequestBody String body) {
//Do another stuff with RequestBody
}
UPD: added "consumes = "application/json". It helps dividing simple POST requests and JSON POST requests.

Categories

Resources