Sending details of the service of a single-mode mobility service provider (Java)
In this use case, the user usually clicks on a mobility service provider to view the service it offers. The mobility service provider, usually returns the details of the mobility service with its fare policy
Code snippets
BPP receives protocol search
/*
Example Request JSON:
{
"context": {
"domain": "nic2004:60221",
"country": "IND",
"city": "std:080",
"action": "search",
"core_version": "0.9.1",
"bap_id": "https://mock_bap.com/",
"bap_uri": "https://mock_bap.com/beckn/",
"transaction_id": "1209849124",
"message_id": "12341242342",
"timestamp": "2021-03-23T10:00:40.065Z"
},
"message": {
"intent" : {
"fulfillment": {
"start" : {
"location" : {
"gps" : "12.9349377,77.6055586"
}
},
"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": "nic2004:60221",
"country": "IND",
"city": "std:080",
"action": "on_search",
"core_version": "0.9.1",
"bap_id": "https://mock_bap.com/",
"bap_uri": "https://mock_bap.com/beckn/",
"bpp_id": "https://mock_bpp.com/",
"bpp_uri": "https://mock_bpp.com/beckn/",
"transaction_id": "1209849124",
"message_id": "12341242343",
"timestamp": "2021-03-23T10:00:40.065Z"
},
"message": {
"catalog": {
"bpp/descriptor": {
"name": "Big Mobility"
},
"bpp/providers": [
{
"id": "yellow-mobility",
"descriptor" : {
"name": "Yellow Cabs"
},
"locations": [
{
"id": "closest-suv-spot",
"gps": "12.9349377,77.6055586"
},
{
"id": "closest-sedan-spot",
"gps": "12.9349377,77.6055586"
},
{
"id": "closest-sedan-outstation",
"gps": "12.9349377,77.6055586"
}
],
"categories": [
{
"id": "spot_booking",
"descriptor": {
"name": "Spot booking"
}
},
{
"id": "outstation",
"descriptor": {
"name": "Outstation"
}
}
],
"items": [
{
"id": "sedan_spot",
"descriptor" : {
"name" : "4 seater Sedan",
"images" : [
"https://mock_bpp.com/images/sedan.jpg"
]
},
"category_id": "spot_booking",
"location_id": "closest-sedan-spot",
"price" : {
"currency": "INR",
"value": "170"
},
"time": {
"label": "ETA",
"duration": "P14M"
},
"matched": true
},
{
"id": "suv_spot",
"descriptor" : {
"name" : "6 seater SUV ",
"images" : [
"https://mock_bpp.com/images/suv.jpg"
]
},
"category_id": "spot_booking",
"location_id": "closest-suv-spot",
"price" : {
"currency": "INR",
"value": "290"
},
"time": {
"label": "ETA",
"duration": "P12M"
},
"matched": true
},
{
"id": "sedan_outstation",
"descriptor" : {
"name" : "4 Seater Sedan",
"images" : [
"https://mock_bpp.com/images/sedan-out.jpg"
]
},
"category_id": "outstation",
"location_id": "closest-sedan-outstation",
"price" : {
"currency": "INR",
"value": "570"
},
"time": {
"label": "ETA",
"duration": "P17M"
},
"matched": true
}
]
},
{
"id": "red-mobility",
"descriptor": {
"name": "Cabs 4 All"
},
"locations": [
{
"id": "closest-sedan",
"gps": "12.9349377,77.6055586"
}
],
"categories": [
{
"id": "rental",
"descriptor": {
"name": "Rental"
}
}
],
"items": [
{
"id": "sedan_rental",
"descriptor" : {
"name" : "Sedan 5 hours",
"images" : [
"https://mock_bpp.com/images/sedan_rental.jpg"
]
},
"category_id": "rental",
"location_id": "closest-sedan",
"price" : {
"currency": "INR",
"value": "200"
},
"time": {
"label": "ETA",
"duration": "P12M"
},
"matched": 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);
}
}