Reputation: 5790
I have an API endpoint and an Authorization token for that API.
The said API is for .xls
report download. How can I view the downloaded .xls
file using (if possible) Postman?
If it is not possible using Postman what are the other programmatic ways I should be looking for?
Upvotes: 365
Views: 344012
Reputation: 1769
My answer is for those that are trying to download excel file in laravel using api route. It's important to note that I was using laravel Jobs and dispatch stuff. And I was sending the return request to a json_success helper function which was actually converting my download response to a json. So I simply removed anything that comes in between downloading file. And it's working fine now. As I am using repository structure so I will try to post each function from repository to controller. Dispatch was also giving me 0 which wasn't letting the file to be downloaded.
Before
// export service data // Repository function
public function exportInsuranceServices($insuranceId)
{
return dispatch_sync(new ExportInsuranceServiceJob($insuranceId));
}
this is the job class
class ExportInsuranceServiceJob implements ShouldQueue
{
use Dispatchable, Queueable;
protected $insuranceId;
public function __construct($insuranceId) {
$this->insuranceId = $insuranceId;
}
public function handle()
{
return Excel::download(new ExportInsuranceService($this->insuranceId), 'insuranceService.xlsx',null, [
'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
])->getStatusCode();
}
}
Export Insurance Service
class ExportInsuranceService implements FromQuery, WithHeadings, ShouldAutoSize
{
use Exportable;
protected $insuranceId;
public function __construct($insuranceId) {
$this->insuranceId = $insuranceId;
}
public function query()
{
return InsuranceService::query()
->where('insurance_id',decryptId($this->insuranceId))
->select('name_en', 'name_ar','code', 'price','original_price', 'insurance_id','service_id','status');
}
public function headings(): array
{
return [
'name_en', 'name_ar','code', 'price','original_price','insurance_id', 'service_id','status'
];
}
}
Controller function
/**
* Export Insurance Services by insurance id.
*/
public function export($insurance_id,InsuranceServiceRepository $repo)
{
return jsend_success($repo->exportInsuranceServices($insurance_id));
}
After
// export service data. Here I have removed the job class
public function exportInsuranceServices($insuranceId)
{
return Excel::download(new ExportInsuranceService($insuranceId), 'insuranceService.xlsx');
}
/**
* Export Insurance Services by insurance id. Here I have removed jsend_success helper function
*/
public function export($insurance_id,InsuranceServiceRepository $repo)
{
return $repo->exportInsuranceServices($insurance_id);
}
The ExportInsuranceService is the same as already shown
Upvotes: 1
Reputation: 9407
Try selecting send and download
instead of send
when you make the request. (the blue button)
https://www.getpostman.com/docs/responses
"For binary response types, you should select Send and download
which will let you save the response to your hard disk. You can then view it using the appropriate viewer."
Upvotes: 870
Reputation: 244
For UI, choose Send and Download button instead of Send button in Postman:
Upvotes: 9
Reputation: 4294
You can Just save the response(pdf,doc etc..) by option on the right side of the response in postman
check this image
For more Details check this
https://learning.getpostman.com/docs/postman/sending_api_requests/responses/
Upvotes: 31
Reputation: 801
In postman - Have you tried adding the header element 'Accept' as 'application/vnd.ms-excel'
Upvotes: 7
Reputation: 5757
If the endpoint really is a direct link to the .xls file, you can try the following code to handle downloading:
public static boolean download(final File output, final String source) {
try {
if (!output.createNewFile()) {
throw new RuntimeException("Could not create new file!");
}
URL url = new URL(source);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// Comment in the code in the following line in case the endpoint redirects instead of it being a direct link
// connection.setInstanceFollowRedirects(true);
connection.setRequestProperty("AUTH-KEY-PROPERTY-NAME", "yourAuthKey");
final ReadableByteChannel rbc = Channels.newChannel(connection.getInputStream());
final FileOutputStream fos = new FileOutputStream(output);
fos.getChannel().transferFrom(rbc, 0, 1 << 24);
fos.close();
return true;
} catch (final Exception e) {
e.printStackTrace();
}
return false;
}
All you should need to do is set the proper name for the auth token and fill it in.
Example usage:
download(new File("C:\\output.xls"), "http://www.website.com/endpoint");
Upvotes: 9