Receiving the pickup and drop location of a package and sending list of delivery service options (Java)
In this use case, the user searches for delivery services by specifying some details about the package, where it needs to be picked up from and dropped. As a result, the user sees a list of available delivery options to choose from and some associated costs involved.
Code snippets
BPP receives protocol search
/*
Example Request JSON:
{
"context": {
"domain": "delivery",
"country": "IND",
"city": "std:080",
"action": "search",
"core_version": "0.9.2",
"bap_id": "https://mock_bap.com/",
"bap_uri": "https://mock_bap.com/beckn/",
"transaction_id": "1239890342",
"message_id": "123793824",
"timestamp": "2021-03-23T10:00:40.065Z"
},
"message": {
"intent" : {
"fulfillment": {
"start" : {
"location" : {
"gps" : "12.4535445,77.9283792"
}
},
"end" : {
"location" : {
"gps" : "12.4535445,77.9283792"
}
}
}
}
}
}
*/
// BPP Search endpoint
@PostMapping("/bpp/search")
public ResponseEntity search(
@RequestHeader HttpHeaders headers,
@RequestBody SearchRequest request) {
var response = bppApplicationService.search(request, headers);
return ResponseEntity.ok(response);
}
BPP processes the search
public Response search(SearchRequest request, HttpHeaders headers) {
var searchResponse = new OnSearchRequest();
// Validate the headers
var isHeadersValid = validateHeaders(headers);
// Construct and return error
if (!isHeadersValid) return null;
// Fetch the data based on the request
var requestIntent = request.getMessage().getIntent();
// Execute business logic here
// Generate the response
searchResponse = generateSearchResponse(searchResult);
//invoke on_search api
return invokeOnSearch(searchResponse, headers);
}
}
BPP generates response
/*
Example Response JSON:
{
"context": {
"domain": "delivery",
"country": "IND",
"city": "std:080",
"action": "on_search",
"core_version": "0.9.2",
"bap_id": "https://mock_bap.com/",
"bap_uri": "https://mock_bap.com/beckn/",
"transaction_id": "1239890342",
"message_id": "123793824",
"timestamp": "2021-03-23T10:00:40.065Z"
},
"message": {
"catalog" : {
"bpp/descriptor": {
"name": "Fast Logistics"
},
"bpp/providers" : [
{
"id": "fast-logistics",
"descriptor" : {
"name": "Fast Logistics"
},
"items" : [
{
"id": "standard",
"descriptor" : {
"name" : "Standard Delivery"
},"price" : {
"currency": "INR",
"value": "40"
},
"matched": true
},
{
"id": "express",
"descriptor" : {
"name" : "Express Delivery"
},
"price" : {
"currency": "INR",
"value": "60"
},
"recommended": true
}
]
}
]
}
}
}
*/
public OnSearchRequest generateSearchResponse(List searchResult) {
var searchResult = SearchResponseBuilder.builder.result(searchResult).build();
// Convert response into protocol object similar to example above
return searchResult;
}
BPP calls protocol on_search
public Response invokeOnSearch(OnSearchRequest searchResponse, HttpHeaders headers) {
if(searchResponse.getError() == null) {
// Call BAP on_search api with the search response
// Call to look up function which returns the the public key and BAP/BG Endpoint to be called
var url = lookUp(headers);
var response = apiClient.post(url[0] + Context.ActionEnum.on_search,
constructResponseHeaders(),
searchResponse,
OnSearchRequest.class);
return Response.of("ACK", null);
} else {
return Response.of("NACK", null);
}
}