Web Services 从PostgreSQL过程/函数调用REST风格的Web服务

r7knjye2  于 2023-03-03  发布在  PostgreSQL
关注(0)|答案(3)|浏览(216)

我已经获得了REST风格的Web服务,可以将数据推送到另一个应用程序的远程数据库中。我需要调用这些服务,通过将JSON格式的数据作为GET/POST参数发送到Web服务来从PostgreSQL数据库推送数据。是否可以从PostgreSQL函数调用这些Web服务(定期)首先将数据推送到我的数据库中,或者编写JAVA代码来调用这些在PostgreSQL数据库上运行查询的web服务,并且调用web服务来将它们传递到远程DB。

dtcbnfnu

dtcbnfnu1#

使用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$
;
mrfwxfqh

mrfwxfqh2#

是的,这是可能的,虽然不是直接从Postgresql本身。我不知道Java,但最快的方法是使用plperluREST::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$
dxpyg8gm

dxpyg8gm3#

    • 溶液1:使用JOOQ**

首先从XML文件生成类以匹配PostGRESQL数据库结构。
然后可以在代码中使用它们,例如在Java应用程序中:

try (DatabaseContext dbCtx=new DatabaseContext())
    {

      DSLContext ctx=dbCtx.getContext();
      ctx.insertInto(TABLE)
      .set(TABLE.ID, values.getId())
      .set(TABLE.DATA, values.getData().toString())
      .execute();
    }
    • 溶液2:使用休眠**

首先设置hibernatexml和Java文件来Map数据库,类似于JOOQ解决方案。
然后再次连接到数据库并推送数据。

Configuration cfg=new Configuration();  
  cfg.configure("your_database_configuration_file.cfg.xml");
  SessionFactory factory=cfg.buildSessionFactory();  
  Session session=factory.openSession();  
  Transaction t=session.beginTransaction();  

  TranstateData e1=new TranstateData();  
  e1.setId(idR);  
  e1.setData(dataR);  
  session.persist(e1);
  t.commit();
  session.close();

这种解决方案优于编写SQL直接连接到数据库,因为您可以随时更新(例如,编写一个执行此操作的任务)修改表时(这意味着您不必编写两次配置!代码将自动生成更改)。您还可以更快地找到错误,因为您可以看到您拥有的类和变量。更不用说它们不是玩Jooq和Hibernate的唯一方法...还有其他的可能性。互联网上到处都是其他的例子。MyBatis也是一个解决方案(解决方案3)。所有提到的都支持PostgreSQL。

相关问题