NodeJS 如何使用graphql从REST API获取数据[已关闭]

2fjabf4q  于 2022-12-03  发布在  Node.js
关注(0)|答案(2)|浏览(250)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题吗?**通过editing this post添加详细信息并阐明问题。

2天前关闭。
Improve this question
如何使用graphql查询从REST API获取数据
如何使用graphql从REST API获取数据

svdrlsy4

svdrlsy41#

一般来说,以传统的RESTful方式查询REST API更容易,而GraphQl只查询GraphQL。但是,我将假设在您的示例中,您运行了GraphQL服务器,并且您正在尝试查询一个只能使用REST的公共API。有几种不同的方法可以完成此操作,但这两种方法都需要您对所查询的数据模式有一定的了解。
如果您想在客户端执行此操作,您可以使用axios、fetch、got或任何其他您喜欢的HTTP代理来执行典型的REST查询,并将该数据与GraphQL数据合并到UI中。Apollo Client提供了一个选项,通过在查询中的特定字段上包含@client来区分数据而不是来自GraphQL API。这有助于维护该高速缓存并保持全局模式同步。
如果您已经运行了GraphQL服务器,则需要定义自定义架构和解析器,以匹配从REST API获取的数据。下面是一个非常小的示例,使用express-graphql通过SpaceX REST API创建GraphQL端点。

const {
  GraphQLObjectType,
  GraphQLInt,
  GraphQLString,
  GraphQLBoolean,
  GraphQLList,
  GraphQLSchema
} = require('graphql');

// Launch Type
const LaunchType = new GraphQLObjectType({
  name: 'Launch',
  fields: () => ({
    flight_number: { type: GraphQLInt },
    mission_name: { type: GraphQLString },
    launch_year: { type: GraphQLString },
    launch_date_local: { type: GraphQLString },
    launch_success: { type: GraphQLBoolean }
  })
});

const LaunchQuery = new GraphQLObjectType({
 name: 'LaunchQueryType',
 fields: {
  launches: {
   type: new GraphQLList(LaunchType),
    resolve(parent, args) {
     return axios
     .get('https://api.spacexdata.com/v4/launches')
     .then(res => res.data);
     }
    }
   }
});

module.exports = new GraphQLSchema({query: LaunchQuery});

然后,您可以将其与其他解析器合并,以完成GraphQL端点。

g9icjywg

g9icjywg2#

选项1)使用一些Graphql服务器:Apollo在REST之上分层GraphQL此处提供详细信息https://www.apollographql.com/blog/backend/layering-graphql-on-top-of-rest/或者Hasura能够设置GraphQL以从REST API获取数据
选项2)对于您自己的编码,使用EasyManage(免费计划)在所需模式上生成免费GraphQL API和REST API,并在内部自定义GraphQL解析器以从REST API获取数据:此处示例:
GrpahQL解析器:

@QueryMapping
public List<DgproductinventoryviewTblRec> DgproductinventoryviewTblRecViewAll()  
    throws Exception 
    {   
    List<DgproductinventoryviewTblRec> DgproductinventoryviewTblRecList = new ArrayList<DgproductinventoryviewTblRec>(); 
    try { 
 
        DgproductinventoryviewTblRec1Repository.findAll().forEach(DgproductinventoryviewTblRecList::add); 
         
 
    } catch (Exception e) { 
        System.out.println("Error: Exception:  "+e.getMessage()); 
        //e.printStackTrace(System.out); 
        throw new Exception(e.getMessage()); 
    } 
    return DgproductinventoryviewTblRecList; 
}

根据以下内容自定义上述解析器,以从REST API中提取(注意:类名不同,这只是代码建议):

//Get from 1st Db
        InventoryTblRec1Repository.findAll().forEach(InventoryTblRecList::add); 
        //InventoryTblRec1Repository.findByColumnName(columnVal).forEach(InventoryTblRecList::add); 

        //----------------------------------------------------------------------------
        //Get from 2nd Db
        String get_state = "http://127.0.0.1:9085/emdbrest/inventory/ViewAll";
        WebClient webClient1 = WebClient.builder().baseUrl(get_state)
        .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).build();

        Mono<List<InventoryTblRec>> response =
        webClient1.get()
        .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE).retrieve()
        .bodyToMono(new ParameterizedTypeReference<List<InventoryTblRec>>() {});
        
        List<InventoryTblRec> getListInventoryTblRec = response.block();

        getListInventoryTblRec.forEach(InventoryTblRecList::add);
        //----------------------------------------------------------------------------

代码可以下载,然后定制和打包/运行为jar graphql服务。

相关问题