Ich habe eine kleine Sinatra-API, die ich versuche zu verschönern. Die meisten meiner Routen sind einfache Datenbankoperationen, aber einige beinhalten das Aufrufen eines externen Dienstes, bevor Datenbankoperationen durchgeführt werden. In allen Fällen ist der größte Teil des Codes gleich, außer wie ich auf die Antwort des Dienstes reagiere. Gibt es einen raffinierten funktionalen Programmieransatz?
Hier ist ein Beispiel einer dieser Routen:
get '/update_x' do
validateParams(params,:x)
xid = params[:x]
xName = getNameFromId(xid)
if xName
# Anfrage an Proxy-Service senden
rid = generateRandomHexNumber(16) # requestId generieren
params['m'] = 'set'
params['rid'] = rid
json = "{}"
begin
response = @resource["/"+"?rid=#{rid}&id=#{xid}&json=#{json}"].get
status = response.code
body = response.body
parsed_json = JSON(body)
if parsed_json['response'] and parsed_json['response']['success'] and parsed_json['response']['success']=='false'
msg = {:success => "false", :response => "unknown error"}
if parsed_json['response']['response']
msg = {:success => "false", :response => parsed_json['response']['response']}
end
content_type :json
msg.to_json
else
#### Hier steht spezifischer Code für diesen API-Aufruf
updateDBHelper(xid,buildUpdateOptions(params))
params['ss_status'] = status
content_type :json
params.to_json
#### Ende spezifisch für API-Aufruf
end
rescue Exception=>e
params['ss_status'] = status
params['exception'] = e
content_type :json
params.to_json
end
else
msg = {:success => "false", :response => "Not found"}
content_type :json
msg.to_json
end
end