Vous avez reçu un message "Your GitLab account has been locked ..." ? Pas d'inquiétude : lisez cet article https://docs.gricad-pages.univ-grenoble-alpes.fr/help/unlock/

Commit 20971c51 authored by Jerome Touvier's avatar Jerome Touvier
Browse files

refactoring

parent d6e08bea
Pipeline #47214 passed with stage
in 1 minute and 8 seconds
......@@ -22,7 +22,7 @@ class Parameters:
self.media = "all"
self.granularity = None
self.orderby = "nslc"
self.format = None
self.format = "text"
self.nodata = "204"
self.constraints = {
"booleans": [],
......
......@@ -4,11 +4,15 @@ REQUEST = ("storage", "send", "country", "timeseries")
DATATYPE = ("all", "bud", "validated")
GRANULARITY = ("year", "month")
ORDERBY = ("nslc", "time", "country", "protocol")
OUTPUT = ("csv", "request", "sync", "text")
OUTPUT = ("csv", "text")
MEDIA = ("all", "seedlink", "dataselect")
NODATA_CODE = ("204", "404")
TIMEOUT = 120
# error message constants
DOCUMENTATION_URI = "http://ws.resif.fr/resifws/statistics/1/"
SERVICE = "resifws-statistics"
class Error:
UNKNOWN_PARAM = "Unknown query parameter: "
......@@ -16,10 +20,6 @@ class Error:
VALID_PARAM = "Valid parameters."
START_LATER = "The starttime cannot be later than the endtime: "
UNSPECIFIED = "Error processing your request."
NO_CONNECTION = "No services could be discovered at http://ws.resif.fr.\n\
This could be due to a temporary service outage, an invalid FDSN service address,\n\
an inactive internet connection or a blocking firewall rule."
OK_CONNECTION = "Connection OK. "
NODATA = "Your query doesn't match any available data."
TIMEOUT = f"Your query exceeds timeout ({TIMEOUT} seconds)."
MISSING = "Missing parameter: "
......@@ -53,7 +53,6 @@ class HTTP:
_403_ = "Forbidden access. "
_404_ = "No data matches the selection. "
_408_ = "Request exceeds timeout. "
_409_ = "Too much data. "
_413_ = "Request too large. "
_414_ = "Request URI too large. "
_500_ = "Internal server error. "
......
......@@ -92,7 +92,6 @@ def sql_request(params):
def collect_data(params):
""" Get the result of the SQL query. """
tic = time.time()
logging.debug("Start collecting data...")
with psycopg2.connect(current_app.config["DATABASE_URI"]) as conn:
logging.debug(conn.get_dsn_parameters())
......@@ -103,7 +102,6 @@ def collect_data(params):
curs.execute(select)
logging.debug(curs.statusmessage)
return curs.fetchall()
logging.debug(f"Get data in {tictac(tic)} seconds.")
def sum_results(params, data):
......@@ -205,8 +203,7 @@ def get_output(params):
if not data:
code = params["nodata"]
return error_request(msg=f"HTTP._{code}_", details=Error.NODATA, code=code)
nrows = len(data)
logging.info(f"Number of collected rows: {nrows}")
logging.info(f"Number of collected rows: {len(data)}")
if params["request"] in ("send", "country"):
data = sum_results(params, data)
......
import logging
import queue
from copy import copy
from multiprocessing import Process, Queue
from flask import request
from apps.constants import ALIAS
from apps.constants import Parameters
from apps.globals import Error
......@@ -97,18 +97,18 @@ def check_parameters(params):
return (params, {"msg": HTTP._200_, "details": Error.VALID_PARAM, "code": 200})
def checks_get(request):
def checks_get():
# get default parameters
params = Parameters().todict()
# check if the parameters are unknown
(p, result) = check_request(request, params, ALIAS)
(p, result) = check_request(params, ALIAS)
if result["code"] != 200:
return (p, result)
# determine selected features
params["base_url"] = request.base_url
params["request"] = tuple(request.args)
for key, val in params.items():
params[key] = request.args.get(key, val)
......@@ -122,19 +122,18 @@ def checks_get(request):
return check_parameters(params)
def output(request):
def output():
try:
process = None
result = {"msg": HTTP._400_, "details": Error.UNKNOWN_PARAM, "code": 400}
logging.debug(request.url)
(pdic, result) = checks_get(request)
(params, result) = checks_get()
if result["code"] == 200:
def put_response(q):
q.put(get_output(pdic))
q.put(get_output(params))
q = Queue()
process = Process(target=put_response, args=(q,))
......
......@@ -7,6 +7,7 @@ from datetime import datetime, timedelta
from flask import Response, request
from apps.constants import VERSION
from apps.globals import DOCUMENTATION_URI
from apps.globals import Error
from apps.globals import HTTP
from apps.globals import REQUEST
......@@ -14,6 +15,7 @@ from apps.globals import MEDIA
from apps.globals import NODATA_CODE
from apps.globals import ORDERBY
from apps.globals import OUTPUT
from apps.globals import SERVICE
from apps.globals import STRING_FALSE
from apps.globals import STRING_TRUE
from apps.globals import DATATYPE
......@@ -79,7 +81,7 @@ def is_valid_channel(channel):
def is_valid_bool_string(string):
if string is None:
return False
return True if string.lower() in (STRING_TRUE + STRING_FALSE) else False
return bool(string.lower() in STRING_TRUE + STRING_FALSE)
def is_valid_output(output):
......@@ -98,8 +100,8 @@ def is_valid_orderby(orderby):
return orderby.lower() in ORDERBY if orderby else False
def is_valid_request(request):
return request.lower() in REQUEST if request else False
def is_valid_request(request_type):
return request_type.lower() in REQUEST if request_type else False
def is_valid_media(media):
......@@ -132,14 +134,18 @@ def error_param(params, dmesg):
# Error request function
def error_request(msg=" ", details=" ", code=" "):
def error_request(msg="", details="", code=500):
request_date = datetime.utcnow().strftime("%Y-%b-%d %H:%M:%S UTC")
message_error = f"Error {code}: {msg} Please mention your request URL when asking for support\n\n\
More Details: {details}\n\n\
Request: {request.url}\n\
Request Submitted: {request_date} \n\
Service version: version {VERSION}"
return Response(message_error, status=code, mimetype="*/*")
message_error = f"""Error {code}: {msg}\n
{details}\n
Usage details are available from {DOCUMENTATION_URI}\n
Request:
{request.url}\n
Request Submitted:
{request_date}\n
Service version:
Service: {SERVICE} version:{VERSION}"""
return Response(message_error, status=code, mimetype="text/plain")
# Error 413 response alias
......@@ -153,7 +159,7 @@ def error_500(dmesg):
# check request
def check_request(request, params, alias):
def check_request(params, alias):
keys = list(params.keys())
for key, val in request.args.items():
if key not in keys:
......@@ -190,7 +196,7 @@ def check_base_parameters(params, max_days=None):
val = params[key]
if not is_valid_bool_string(val):
return error_param(params, f"Invalid {key} value: {val} {Error.BOOL}.")
params[key] = True if val.lower() in STRING_TRUE else False
params[key] = bool(val.lower() in STRING_TRUE)
# Float parameter validations
for key in params["constraints"]["floats"]:
......@@ -209,19 +215,19 @@ def check_base_parameters(params, max_days=None):
location = params["location"].split(",")
channel = params["channel"].split(",")
for n in network:
# if not is_valid_network(n):
if not is_valid_extended_network(n):
return error_param(params, Error.NETWORK + n)
for s in station:
if not is_valid_station(s):
return error_param(params, Error.STATION + s)
for l in location:
if not is_valid_location(l):
return error_param(params, Error.LOCATION + l)
for c in channel:
if not is_valid_channel(c):
return error_param(params, Error.CHANNEL + c)
for net in network:
# if not is_valid_network(net):
if not is_valid_extended_network(net):
return error_param(params, Error.NETWORK + net)
for sta in station:
if not is_valid_station(sta):
return error_param(params, Error.STATION + sta)
for loc in location:
if not is_valid_location(loc):
return error_param(params, Error.LOCATION + loc)
for cha in channel:
if not is_valid_channel(cha):
return error_param(params, Error.CHANNEL + cha)
# Start time and end time validations
if params["start"] is not None:
......
......@@ -11,7 +11,7 @@ This service provides access to the RESIF-DC statistics.
request-options :: (request=<country|send|storage|timeseries>)
channel-options :: [net=<network> & sta=<station> & loc=<location> & cha=<channel>]
date-options :: [starttime=<date>] & [endtime=<date>]
storage-options :: [year=<year>] & [type=<type>]
storage-options :: [year=<year>] & [type=<all|bud|validated>]
send-options :: [country=<country_code>] & [media=<all|dataselect|seedlink>]
output-options :: [format=<csv|request|sync|text>]
......@@ -28,3 +28,40 @@ This service provides access to the RESIF-DC statistics.
<a href="http://ws.resif.fr/resifws/statistics/1/query?request=country&media=dataselect&net=RA&country=IT,US,FR">http://ws.resif.fr/resifws/statistics/1/query?request=country&media=dataselect&net=RA&country=IT,US,FR</a>
<a href="http://ws.resif.fr/resifws/statistics/1/query?request=country&media=seedlink&net=RA&starttime=2020-01-01">http://ws.resif.fr/resifws/statistics/1/query?request=country&media=seedlink&net=RA&starttime=2020-01-01</a>
## Detailed descriptions of each query parameter
| Parameter | Example | Discussion |
| :--------- | :------- | :----------------------------------------------------------------------------- |
| net[work] | FR | Seismic network name. |
| sta[tion] | CIEL | Station name. |
| loc[ation] | 00 | Location code. Use loc=-- for empty location codes. This parameter accepts wildcards. |
| cha[nnel] | HHZ | Channel Code. This parameter accepts wildcards. |
| start[time] | 2010-01-10T00:00:00 | Specify the responses that cover the time period after (and including) this time. |
| end[time] | 2011-02-11T01:00:00 | Specify responses that cover the time period prior to this time. |
| format | json | Specify output format. Accepted values are text (the default) and csv. |
## Station code details
- network = one to two alphanumeric characters
- station = one to five alphanumeric characters
- location = two alphanumeric characters
- channel = three alphanumeric characters
## Date and time formats
YYYY-MM-DDThh:mm:ss[.ssssss] ex. 1997-01-31T12:04:32.123
YYYY-MM-DD ex. 1997-01-31 ( a time of 00:00:00 is assumed)
where:
YYYY :: four-digit year
MM :: two-digit month (01=January, etc.)
DD :: two-digit day (01 through 31)
T :: date-time separator
hh :: two-digit hour (00 through 23)
mm :: two-digit number of minutes (00 through 59)
ss :: two-digit number of seconds (00 through 59)
ssssss :: one to six-digit number of microseconds (0 through 999999)
......@@ -11,7 +11,7 @@ Ce service donne accès aux statistiques de RESIF-DC.
request-options :: (request=<country|send|storage|timeseries>)
channel-options :: [net=<network> & sta=<station> & loc=<location> & cha=<channel>]
date-options :: [starttime=<date>] & [endtime=<date>]
storage-options :: [year=<year>] & [type=<type>]
storage-options :: [year=<year>] & [type=<all|bud|validated>]
send-options :: [country=<country_code>] & [media=<all|dataselect|seedlink>]
output-options :: [format=<csv|request|sync|text>]
......@@ -27,3 +27,53 @@ Ce service donne accès aux statistiques de RESIF-DC.
<a href="http://ws.resif.fr/resifws/statistics/1/query?request=country&media=dataselect&net=RA&country=IT,US,FR">http://ws.resif.fr/resifws/statistics/1/query?request=country&media=dataselect&net=RA&country=IT,US,FR</a>
<a href="http://ws.resif.fr/resifws/statistics/1/query?request=country&media=seedlink&net=RA&starttime=2020-01-01">http://ws.resif.fr/resifws/statistics/1/query?request=country&media=seedlink&net=RA&starttime=2020-01-01</a>
## Descriptions détaillées de chaque paramètre de la requête
| Paramètre | Exemple | Discussion |
| :--------- | :------ | :------------------------------------------------------------------------------ |
| net[work] | FR | Nom du réseau sismique. |
| sta[tion] | CIEL | Nom de la station. |
| loc[ation] | 00 | Code de localisation. Utilisez loc=-- pour des codes de localisations vides. Ce paramètre accepte les jokers. |
| cha[nnel] | HHZ | Code de canal. Ce paramètre accepte les jokers. |
| start[time] | 2010-01-10T00:00:00 | Donne les réponses qui couvrent la période après la date donnée incluse. |
| end[time] | 2011-02-11T01:00:00 | Donne les réponses qui couvrent la période avant la date donnée incluse. |
| format | txt | Format de sortie. Valeurs autorisées : text et csv. |
| request | send | Type de la statistique demandée. Valeurs autorisées : <br> - __country__ : nombre de requêtes passées par pays <br> - __send__ : volume de données distribuées par protocoles <br> - __storage__ : quantité de données stockées brutes et validées <br> - __timeseries__ : produit une série temporelle avec en colonne le pays, le nombre et la taille cumulés des requêtes |
### Options supplémentaires spécifiques aux requêtes country, send, et timeseries
| Paramètre | Exemple | Discussion |
| :--------- | :------ | :------------------------------------------------------------------------------ |
| country | FR,GB | Filtre les réponses avec une liste des pays d'origine. La valeur est l'abréviation en deux lettres du pays. |
| media | seedlink | Protocoles utilisés pour la requête. Valeurs autorisées : all (par défaut), dataselect et seedlink |
### Options supplémentaires spécifiques à la requête storage
| Paramètre | Exemple | Discussion |
| :--------- | :------ | :------------------------------------------------------------------------------ |
| type | validated | Choix entre les données stockées brutes et validées. Valeurs autorisées : all (par défaut), bud et validated |
| years | 2019,2020 | Liste des années pour lesquelles on demande la quantité de données. |
## Détails sur la nomenclature des codes
- NETWORK : 1 à 2 caractères alphanumériques. Un groupe de points de mesures.
- STATION : 1 à 5 caractères alphanumériques. Un site de mesure dans un réseau.
- CHANNEL : 3 caractères alphanumériques. Le premier caractère indique la bande de fréquence du capteur, le second le type de l'instrument et le troisième l'orientation physique.
- LOCATION : 2 caractères alphanumériques. Ils permettent de distinguer plusieurs flux de données d'un même canal.
## Formats des dates et des heures
YYYY-MM-DDThh:mm:ss[.ssssss] ex. 1997-01-31T12:04:32.123
YYYY-MM-DD ex. 1997-01-31 (une heure de 00:00:00 est supposée)
avec :
YYYY :: quatre chiffres de l'année
MM :: deux chiffres du mois (01=Janvier, etc.)
DD :: deux chiffres du jour du mois (01 à 31)
T :: séparateur date-heure
hh :: deux chiffres de l'heure (00 à 23)
mm :: deux chiffres des minutes (00 à 59)
ss :: deux chiffres des secondes (00 à 59)
ssssss :: un à six chiffres des microsecondes en base décimale (0 à 999999)
import logging
import os
from flask import Flask, make_response, render_template, request
from flask import Flask, make_response, render_template
from apps.constants import VERSION
from apps.root import output
......@@ -10,28 +10,28 @@ from config import Config
app = Flask(__name__)
fmt = "[%(asctime)s] %(levelname)s [%(filename)s:%(lineno)d] [%(funcName)s] %(message)s"
loglevel = logging.INFO if os.environ.get("RUNMODE") == "prodution" else logging.DEBUG
logging.basicConfig(format=fmt, level=loglevel)
FMT = "[%(asctime)s] %(levelname)s [%(filename)s:%(lineno)d] [%(funcName)s] %(message)s"
LOGLEVEL = logging.INFO if os.environ.get("RUNMODE") == "prodution" else logging.DEBUG
logging.basicConfig(format=FMT, level=LOGLEVEL)
app.config.from_object(Config)
if app.config["RUNMODE"]:
app.logger.debug("Configuration set with RUNMODE=%s", app.config["RUNMODE"])
app.logger.debug("Database URI : %s", app.config["DATABASE_URI"])
app.logger.debug("Database URI: %s", app.config["DATABASE_URI"])
# **************************************************************************
# ********************** STATISTICS SERVICE ROUTES *************************
# **************************************************************************
# ************************************************************************
# **************************** SERVICE ROUTES ****************************
# ************************************************************************
@app.route("/query", methods=["GET"])
def statistics_root_get():
return output(request)
def query():
return output()
@app.route("/application.wadl")
def statistics_wadl():
template = render_template("ws-statistics.wadl.xml")
def wadl():
template = render_template("wadl.xml")
response = make_response(template)
response.headers["Content-Type"] = "application/xml"
return response
......@@ -47,11 +47,10 @@ def version():
@app.route("/commit", strict_slashes=False)
def commit():
try:
with open("./static/commit.txt") as fc:
COMMIT_SHORT_SHA = fc.readline()
with open("./static/commit.txt") as commit_file:
COMMIT_SHORT_SHA = commit_file.readline()
except Exception:
COMMIT_SHORT_SHA = "unspecified"
pass
response = make_response(COMMIT_SHORT_SHA)
response.headers["Content-Type"] = "text/plain"
return response
......@@ -59,13 +58,13 @@ def commit():
@app.route("/")
@app.route("/local=fr")
def statistics_doc():
return render_template("statistics_doc.html")
def doc():
return render_template("doc.html")
@app.route("/local=en")
def statistics_doc_en():
return render_template("statistics_doc_en.html")
def doc_en():
return render_template("doc_en.html")
# **** MAIN ****
......
......@@ -11,9 +11,6 @@
span.underline{text-decoration: underline;}
div.column{display: inline-block; vertical-align: top; width: 50%;}
</style>
<!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
<![endif]-->
<link rel="stylesheet" href="./static/resifws.css"/>
<a href="./local=en"> <img src="./static/images/en.png" alt="Français - Anglais"> </a>
</head>
......@@ -29,7 +26,7 @@ où :
request-options :: (request=&lt;country|send|storage|timeseries&gt;)
channel-options :: [net=&lt;network&gt; &amp; sta=&lt;station&gt; &amp; loc=&lt;location&gt; &amp; cha=&lt;channel&gt;]
date-options :: [starttime=&lt;date&gt;] &amp; [endtime=&lt;date&gt;]
storage-options :: [year=&lt;year&gt;] &amp; [type=&lt;type&gt;]
storage-options :: [year=&lt;year&gt;] &amp; [type=&lt;all|bud|validated&gt;]
send-options :: [country=&lt;country_code&gt;] &amp; [media=&lt;all|dataselect|seedlink&gt;]
output-options :: [format=&lt;csv|request|sync|text&gt;]
......@@ -40,5 +37,137 @@ output-options :: [format=&lt;csv|request|sync|text&gt;]
<p><a href="http://ws.resif.fr/resifws/statistics/1/query?request=send&media=dataselect&net=WI&country=IT">http://ws.resif.fr/resifws/statistics/1/query?request=send&amp;media=dataselect&amp;net=WI&amp;country=IT</a></p>
<p><a href="http://ws.resif.fr/resifws/statistics/1/query?request=country&media=dataselect&net=RA&country=IT,US,FR">http://ws.resif.fr/resifws/statistics/1/query?request=country&amp;media=dataselect&amp;net=RA&amp;country=IT,US,FR</a></p>
<p><a href="http://ws.resif.fr/resifws/statistics/1/query?request=country&media=seedlink&net=RA&starttime=2020-01-01">http://ws.resif.fr/resifws/statistics/1/query?request=country&amp;media=seedlink&amp;net=RA&amp;starttime=2020-01-01</a></p>
<h2 id="descriptions-détaillées-de-chaque-paramètre-de-la-requête">Descriptions détaillées de chaque paramètre de la requête</h2>
<table>
<colgroup>
<col style="width: 10%" />
<col style="width: 7%" />
<col style="width: 82%" />
</colgroup>
<thead>
<tr class="header">
<th style="text-align: left;">Paramètre</th>
<th style="text-align: left;">Exemple</th>
<th style="text-align: left;">Discussion</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;">net[work]</td>
<td style="text-align: left;">FR</td>
<td style="text-align: left;">Nom du réseau sismique.</td>
</tr>
<tr class="even">
<td style="text-align: left;">sta[tion]</td>
<td style="text-align: left;">CIEL</td>
<td style="text-align: left;">Nom de la station.</td>
</tr>
<tr class="odd">
<td style="text-align: left;">loc[ation]</td>
<td style="text-align: left;">00</td>
<td style="text-align: left;">Code de localisation. Utilisez loc=-- pour des codes de localisations vides. Ce paramètre accepte les jokers.</td>
</tr>
<tr class="even">
<td style="text-align: left;">cha[nnel]</td>
<td style="text-align: left;">HHZ</td>
<td style="text-align: left;">Code de canal. Ce paramètre accepte les jokers.</td>
</tr>
<tr class="odd">
<td style="text-align: left;">start[time]</td>
<td style="text-align: left;">2010-01-10T00:00:00</td>
<td style="text-align: left;">Donne les réponses qui couvrent la période après la date donnée incluse.</td>
</tr>
<tr class="even">
<td style="text-align: left;">end[time]</td>
<td style="text-align: left;">2011-02-11T01:00:00</td>
<td style="text-align: left;">Donne les réponses qui couvrent la période avant la date donnée incluse.</td>
</tr>
<tr class="odd">
<td style="text-align: left;">format</td>
<td style="text-align: left;">txt</td>
<td style="text-align: left;">Format de sortie. Valeurs autorisées : text et csv.</td>
</tr>
<tr class="even">
<td style="text-align: left;">request</td>
<td style="text-align: left;">send</td>
<td style="text-align: left;">Type de la statistique demandée. Valeurs autorisées : <br> - <strong>country</strong> : nombre de requêtes passées par pays <br> - <strong>send</strong> : volume de données distribuées par protocoles <br> - <strong>storage</strong> : quantité de données stockées brutes et validées <br> - <strong>timeseries</strong> : produit une série temporelle avec en colonne le pays, le nombre et la taille cumulés des requêtes</td>
</tr>
</tbody>
</table>
<h3 id="options-supplémentaires-spécifiques-aux-requêtes-country-send-et-timeseries">Options supplémentaires spécifiques aux requêtes country, send, et timeseries</h3>
<table>
<colgroup>
<col style="width: 10%" />
<col style="width: 7%" />
<col style="width: 82%" />
</colgroup>
<thead>
<tr class="header">
<th style="text-align: left;">Paramètre</th>
<th style="text-align: left;">Exemple</th>
<th style="text-align: left;">Discussion</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;">country</td>
<td style="text-align: left;">FR,GB</td>
<td style="text-align: left;">Filtre les réponses avec une liste des pays d’origine. La valeur est l’abréviation en deux lettres du pays.</td>
</tr>
<tr class="even">
<td style="text-align: left;">media</td>
<td style="text-align: left;">seedlink</td>
<td style="text-align: left;">Protocoles utilisés pour la requête. Valeurs autorisées : all (par défaut), dataselect et seedlink</td>
</tr>
</tbody>
</table>
<h3 id="options-supplémentaires-spécifiques-à-la-requête-storage">Options supplémentaires spécifiques à la requête storage</h3>
<table>
<colgroup>
<col style="width: 10%" />
<col style="width: 7%" />
<col style="width: 82%" />
</colgroup>
<thead>
<tr class="header">
<th style="text-align: left;">Paramètre</th>
<th style="text-align: left;">Exemple</th>
<th style="text-align: left;">Discussion</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td style="text-align: left;">type</td>
<td style="text-align: left;">validated</td>
<td style="text-align: left;">Choix entre les données stockées brutes et validées. Valeurs autorisées : all (par défaut), bud et validated</td>
</tr>
<tr class="even">
<td style="text-align: left;">years</td>
<td style="text-align: left;">2019,2020</td>
<td style="text-align: left;">Liste des années pour lesquelles on demande la quantité de données.</td>
</tr>
</tbody>
</table>
<h2 id="détails-sur-la-nomenclature-des-codes">Détails sur la nomenclature des codes</h2>
<ul>
<li>NETWORK : 1 à 2 caractères alphanumériques. Un groupe de points de mesures.</li>
<li>STATION : 1 à 5 caractères alphanumériques. Un site de mesure dans un réseau.</li>
<li>CHANNEL : 3 caractères alphanumériques. Le premier caractère indique la bande de fréquence du capteur, le second le type de l’instrument et le troisième l’orientation physique.</li>
<li>LOCATION : 2 caractères alphanumériques. Ils permettent de distinguer plusieurs flux de données d’un même canal.</li>
</ul>
<h2 id="formats-des-dates-et-des-heures">Formats des dates et des heures</h2>
<pre><code>YYYY-MM-DDThh:mm:ss[.ssssss] ex. 1997-01-31T12:04:32.123
YYYY-MM-DD ex. 1997-01-31 (une heure de 00:00:00 est supposée)
avec :
YYYY :: quatre chiffres de l&#39;année
MM :: deux chiffres du mois (01=Janvier, etc.)
DD :: deux chiffres du jour du mois (01 à 31)
T :: séparateur date-heure
hh :: deux chiffres de l&#39;heure (00 à 23)
mm :: deux chiffres des minutes (00 à 59)
ss :: deux chiffres des secondes (00 à 59)
ssssss :: un à six chiffres des microsecondes en base décimale (0 à 999999)</code></pre>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<application>
<doc title="RESIF statistics web service 1.0"/>
<resources base="http://ws.resif.fr/fdsnws/statistics/1">
<resources base="http://ws.resif.fr/resifws/statistics/1">
<resource path="/">
<method name="GET">
<response>
......@@ -55,7 +55,11 @@
<option value="seedlink"/>
</param>
<param name="year" style="query" type="xsd:string"/>
<param name="type" style="query" type="xsd:string"/>
<param name="type" style="query" type="xsd:string">
<option value="all"/>
<option value="bud"/>
<option value="validated"/>
</param>
<param name="nodata" style="query" type="xsd:string"/>
<param name="format" style="query" type="xsd:string">
<option value="csv"/>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment