我已经提供了RESTful Web服务来将数据推送到另一个应用程序的远程数据库中。我需要通过将JSON格式的数据作为GET / POST参数发送到Web服务来调用这些服务来从PostgreSQL DB推送数据。是否可以从PostgreSQL函数(定期)调用这些Web服务,这些函数首先将数据推送到我的数据库中,或者编写JAVA代码来调用这些在PostgreSQL数据库上运行查询的Web服务并调用Web服务将它们传递给远程DB。
答案 0 :(得分:4)
是的,有可能,但不是直接来自Postgresql本身。我不了解Java,但最快的方法是将plperlu
与REST::Client
包一起使用,例如:
CREATE OR REPLACE FUNCTION restful.put(auri character varying, ajson_text text)
RETURNS text
LANGUAGE plperlu
SECURITY DEFINER
AS $function$
use REST::Client;
use Encode qw(encode);
my $client = REST::Client->new();
$client->getUseragent()->proxy( 'https', 'http://some-proxy/' ); # use for proxy authentication
$client->addHeader('Content-Type', 'application/json'); # headers
$client->POST( $_[0], encode('UTF-8', $_[1])); # encoding
return $client->responseContent();
$function$
答案 1 :(得分:1)
解决方案1: 使用JOOQ
首先从xml文件生成类以匹配postgresql数据库结构。
然后您可以在代码中使用它们,例如在Java应用程序中使用它们:
unSeenMsg
解决方案2: 使用Hibernate
首先设置hibernate xml和Java文件以映射数据库,类似于JOOQ解决方案。
然后再次连接到数据库并推送数据。
try (DatabaseContext dbCtx=new DatabaseContext())
{
DSLContext ctx=dbCtx.getContext();
ctx.insertInto(TABLE)
.set(TABLE.ID, values.getId())
.set(TABLE.DATA, values.getData().toString())
.execute();
}
这个解决方案比编写SQL直接连接到数据库更好,因为你可以在修改表时不时更新(例如写一个执行该任务的任务)(这意味着你不必编写配置)两次!代码会自动生成更改)。您还可以更快地找到错误,因为您会看到您拥有的类和变量。 更不用说它们不是解决JOOQ和Hibernate的唯一方法......还有其他可能性。互联网上充满了其他例子。 MyBatis 也是一种解决方案(解决方案3 )。所有提到的都支持PostgreSQL。
答案 2 :(得分:1)
使用plpython2u语言:
解决方案1:(使用urllib2)
CREATE OR REPLACE FUNCTION public.py_pgrest(uri text, body text DEFAULT NULL::text, content_type text DEFAULT 'application/json'::text)
RETURNS text
LANGUAGE plpython2u
AS $function$
import urllib2
from urllib2 import Request, urlopen, URLError, HTTPError
req = Request(uri)
if body:
req.add_data(body)
if content_type:
req.add_header('Content-Type', content_type)
try:
data = urlopen(req)
except HTTPError as e:
return e
except URLError as e:
if hasattr(e, 'reason'):
return e.reason
elif hasattr(e, 'code'):
return e.code
else:
return e
else:
return data.read()
$function$
;
解决方案2:(使用请求)
CREATE OR REPLACE FUNCTION public.py_pgrest(p_url text, p_method text DEFAULT 'GET'::text, p_data text DEFAULT ''::text, p_headers text DEFAULT '{"Content-Type": "application/json"}'::text)
RETURNS text
LANGUAGE plpython2u
AS $function$
import requests, json
try:
r = requests.request(method=p_method, url=p_url, data=p_data, headers=json.loads(p_headers))
except Exception as e:
return e
else:
return r.content
$function$
;