Visión General de la API
La API REST de CAMPETROL conecta la página web pública, el panel CMS y las **aplicaciones móviles nativas e híbridas (iOS, Android, React Native, Flutter)**.
1. Autenticación y Token JWT
Las peticiones de lectura (GET) son **públicas**. Las operaciones de modificación (POST, PUT, DELETE) requieren enviar el token en la cabecera HTTP.
Request Body (JSON)
{
"username": "admin",
"password": "tu_password"
}
Respuesta Exitosa (200 OK)
{
"message": "Login successful",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbW...",
"user": {
"id": 1,
"username": "admin",
"role": "admin",
"permissions": "dashboard,analytics,actualidad,comunicados,banners,usuarios"
}
}
2. API Unificada para App Móvil
Devuelve en **una sola llamada** los banners de la app, las últimas noticias de actualidad y los comunicados de prensa con URLs canónicas absolutas.
Respuesta JSON Ejemplo:
{
"status": "success",
"timestamp": "2026-07-21T09:38:00Z",
"section": "all",
"limit": 5,
"data": {
"banners": [
{
"id": 1,
"target_platform": "both",
"title": "II Rueda de Relacionamiento CAMPETROL 2026",
"tag": "RUEDA DE RELACIONAMIENTO",
"date": "25 DE AGOSTO 2026",
"link": "https://campetrol.org/inicio/eventos-ruedas-relacionamiento.html",
"full_image_url": "https://campetrol.org/inicio/images/banners/rueda.jpg",
"full_app_image_url": "https://campetrol.org/inicio/images/banners/rueda_app.jpg",
"active": true
}
],
"actualidad": [
{
"id": 45,
"title": "Análisis del Mercado Energético Colombia 2026",
"excerpt": "Revisión técnica de la producción de crudo y gas...",
"article_url": "https://campetrol.org/inicio/archivos-articulos/analisis.html"
}
]
}
}
Ejemplos de Código para la App Móvil
Ejemplos de implementación listos para copiar y usar en tu aplicación móvil (React Native, Flutter y Swift).
import React, { useEffect, useState } from 'react';
import { View, Text, FlatList, Image, TouchableOpacity, Linking, ActivityIndicator } from 'react-native';
const API_MOBILE_URL = 'https://campetrol.org/api/mobile?limit=10';
export default function HomeScreen() {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetchMobileHomeData();
}, []);
const fetchMobileHomeData = async () => {
try {
const response = await fetch(API_MOBILE_URL);
const json = await response.json();
if (json.status === 'success') {
setData(json.data);
}
} catch (error) {
console.error('Error cargando API CAMPETROL:', error);
} finally {
setLoading(false);
}
};
if (loading) return <ActivityIndicator size="large" color="#2563eb" style={{ flex: 1 }} />;
return (
<FlatList
data={data?.actualidad || []}
keyExtractor={(item) => item.id.toString()}
ListHeaderComponent={() => (
<View>
<Text style={{ fontSize: 18, fontWeight: 'bold', margin: 16 }}>Banners Móviles</Text>
<FlatList
horizontal
data={data?.banners || []}
keyExtractor={(b) => b.id.toString()}
renderItem={({ item }) => (
<TouchableOpacity onPress={() => item.link && Linking.openURL(item.link)}>
<Image
source={{ uri: item.full_app_image_url || item.full_image_url }}
style={{ width: 300, height: 160, borderRadius: 12, marginRight: 12 }}
/>
</TouchableOpacity>
)}
/>
<Text style={{ fontSize: 18, fontWeight: 'bold', margin: 16 }}>Actualidad CAMPETROL</Text>
</View>
)}
renderItem={({ item }) => (
<TouchableOpacity
onPress={() => item.article_url && Linking.openURL(item.article_url)}
style={{ padding: 16, borderBottomWidth: 1, borderColor: '#e2e8f0' }}
>
<Text style={{ fontSize: 16, fontWeight: 'bold' }}>{item.title}</Text>
<Text style={{ color: '#64748b', marginTop: 4 }}>{item.excerpt}</Text>
</TouchableOpacity>
)}
/>
);
}
import 'dart:convert';
import 'package:http/http.dart' as http;
class CampetrolApiService {
static const String baseUrl = 'https://campetrol.org/api/mobile';
static Future<Map<String, dynamic>?> fetchHomeData() async {
try {
final response = await http.get(Uri.parse('$baseUrl?limit=10'));
if (response.statusCode == 200) {
final data = json.decode(response.body);
return data['data'];
}
} catch (e) {
print('Error al conectar con la API CAMPETROL: $e');
}
return null;
}
}
import Foundation
struct CampetrolMobileResponse: Codable {
let status: String
let data: CampetrolData
}
struct CampetrolData: Codable {
let banners: [BannerItem]
let actualidad: [ArticleItem]
}
struct BannerItem: Codable, Identifiable {
let id: Int
let title: String
let full_app_image_url: String?
let full_image_url: String
let link: String?
}
struct ArticleItem: Codable, Identifiable {
let id: Int
let title: String
let excerpt: String?
let article_url: String
}
class CampetrolViewModel: ObservableObject {
@Published var banners: [BannerItem] = []
@Published var news: [ArticleItem] = []
func loadHomeData() async {
guard let url = URL(string: "https://campetrol.org/api/mobile?limit=10") else { return }
do {
let (data, _) = try await URLSession.shared.data(from: url)
let decoded = try JSONDecoder().decode(CampetrolMobileResponse.self, from: data)
DispatchQueue.main.async {
self.banners = decoded.data.banners
self.news = decoded.data.actualidad
}
} catch {
print("Error cargando API CAMPETROL: \(error)")
}
}
}
Probador de Endpoints en Vivo
Ejecuta consultas en tiempo real directamente sobre la API de producción de CAMPETROL.
// Haz clic en "Probar" para ver la respuesta en vivo