欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

記一次通過c#運用GraphQL調(diào)用Githubapi-創(chuàng)新互聯(lián)

閱讀目錄

  • GraphQL是什么

    成都創(chuàng)新互聯(lián)是一家專注于做網(wǎng)站、成都做網(wǎng)站與策劃設(shè)計,茄子河網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:茄子河等地區(qū)。茄子河做網(wǎng)站價格咨詢:028-86922220
  • .net下如何運用GraphQL

  • 運用GraphQL調(diào)用Github api

  • 結(jié)語

一、Graphql是什么

最近在折騰使用Github api做個微信小程序練練手,本篇文章就是在這個過程中記錄。

直接先看下GraphQL的語法風(fēng)格,感受一下:

query {
  repository(owner:"octocat", name:"Hello-World") {
      id
  }
}

這是最最最簡單的一個運用示例,效果上等價于http://graphqlapi.xxx.com/query/repository?owner=octocat&name=Hello-World ,返回的內(nèi)容格式是這樣:

{  "data": {    "repository": {      "id": "MDEwOlJlcG9zaXRvcnkxMjk2MjY5"
    }
  }
}

再看下稍微復(fù)雜點的查詢方式:

query {
  repository(owner:"octocat", name:"Hello-World") {
    issues(last:20, states:CLOSED) {
      edges {
        node {
          title
          url
          labels(first:5) {
            edges {
              node {
                name
              }
            }
          }
        }
      }
    }
  }
}

這是一個多級對象嵌套的查詢,這里就不繼續(xù)展開了。關(guān)于egde和node在下文會有少許講解。對GraphQL有興趣進行更深入了解的可以自行研究學(xué)習(xí),我自己也是剛?cè)腴T,不坑大家了:),官網(wǎng)是http://graphql.org/(這個可能打不開,可以打開國內(nèi)的地址http://graphql.cn),F(xiàn)acebook發(fā)布的規(guī)范在 http://facebook.github.io/graphql/October2016/。

GraphQL 既是一種用于 API 的查詢語言也是一個滿足你數(shù)據(jù)查詢的運行時。GraphQL 對你的 API 中的數(shù)據(jù)提供了一套易于理解的完整描述,使得客戶端能夠準(zhǔn)確地獲得它需要的數(shù)據(jù),而且沒有任何冗余,也讓 API 更容易地隨著時間推移而演進,還能用于構(gòu)建強大的開發(fā)者工具。

二、.net下如何運用GraphQL

由于我需要做一個定時任務(wù)將github上的數(shù)據(jù)定時拉到本地,所以自然的選擇了后端處理的方式。找了一下.net下的GraphQL客戶端,用了這個graphql-client。代碼如下:

var heroRequest = new GraphQLRequest
                {
                    Query = graphql   //這里填寫query的內(nèi)容。
                };var graphQLClient = new GraphQLClient("https://api.github.com/graphql");

graphQLClient.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("Safari", "537.36"));   
//上面這行很關(guān)鍵,UserAgent一定要寫上,要不然會出現(xiàn)403錯誤,花了好久才找到這個問題。
graphQLClient.DefaultRequestHeaders.Add("Authorization", "bearer token");   //這里的token是個占位,實際需要在Github上生成。var graphQLResponse = graphQLClient.PostAsync(heroRequest).Result;

關(guān)于token的生成以及其它的一些環(huán)境準(zhǔn)備工作,在github上有詳細的描述,參見:https://developer.github.com/v4/guides/forming-calls/#authenticating-with-graphql。

重要的事情說3遍:UserAgent一定要寫上!! UserAgent一定要寫上!! UserAgent一定要寫上!!

三、運用GraphQL調(diào)用Github api

Github提供的API和相關(guān)文檔在https://developer.github.com/v4/ 右側(cè)的目錄樹上,這次筆者需要拉取github的大量repository庫,所以用到的search接口(但是很奇怪,這個接口在文檔中并沒有列出來,也不知道為什么)。建議大家可以先在Github提供的explorer中先測試和驗證,OK了在把代碼寫到實際的項目中。

接著,筆者在實現(xiàn)自己需要的功能時又學(xué)習(xí)了2個概念,才能正常開展下面的工作。第一個是edge與node的概念,edge可以理解為一個分頁對象,其中除了包含實際的數(shù)據(jù)外還有一個cursor(返回的每條數(shù)據(jù)的唯一標(biāo)識,如果要分頁的話用得到這個數(shù)據(jù),配合before與after關(guān)鍵字來使用)字段,實際數(shù)據(jù)就是用node表示的。

另外GraphQL是強類型的,所以當(dāng)筆者用到的search返回的結(jié)果并不是一個明確的數(shù)據(jù)對象時,先需要通過node下的__typename字段來獲得實際的對象是什么。代碼如下:

query {
  search(query:"language:c#",type:REPOSITORY,first:1){
    edges{
      cursor,
      node{
        __typename
      }
    }
  }
}

得到的結(jié)果是:

{  "data": {    "search": {      "edges": [
        {          "cursor": "Y3Vyc29yOjE=",          "node": {            "__typename": "Repository"
          }
        }
      ]
    }
  }
}

得到的實際的數(shù)據(jù)對象是Repository之后,通過查閱Github Api的文檔得到該對象有哪些字段,并且從中選擇需要的字段即可。這個就是GraphQL的設(shè)計天然優(yōu)勢之一,按需獲取。單在接下去運用的時候又需要引入一個新的概念fragment,這個可以理解為一個模板,通過這個模板來向服務(wù)端指明需要獲取的數(shù)據(jù)字段。代碼如下:

fragment repFragment on Repository {
  name,
  forkCount,
  url,
  createdAt,
  updatedAt,
  licenseInfo{  //對象嵌套
    nickname    //licenseInfo的nickname字段
  },
  stargazers{   //對象嵌套
    totalCount  //stargazers的totalCount字段
  }
}

query {
  search(query:"language:c#",type:REPOSITORY,first:100){
    edges{
      cursor,
      node{
        __typename
        ...repFragment
      }
    }
  }
}

好了,這樣就得到我需要的結(jié)果了。

下面附上筆者做的Demo:https://github.com/ZacharyFan/GitHubRanking,其中的token在配置文件中自行替換即可。

四、結(jié)語

最后附帶提一下,GraphQL的出現(xiàn),主要的場景還是在于賦能前端開發(fā),賦予了前端開發(fā)者自由組織和定制請求數(shù)據(jù)的能力。這是一個將前后端分離后的界限偏向前端的框架,所以直接在前端通過GraphQL訪問后端數(shù)據(jù)是個人比較推崇的方式。目前前端非常火熱的GraphQL框架也不少,主流的就是下面2個: apollo(https://github.com/apollographql/apollo-client)、relay(https://github.com/facebook/relay)。

GraphQL雖好,但是要真正在中大型項目中運用GraphQL,還有有很大的困難的,服務(wù)端需要支持到GraphQL的規(guī)范格式進行數(shù)據(jù)輸出,我認(rèn)為需要付出的成本可不小。哪怕的架設(shè)一層中間層,也需要解決諸如分發(fā)、聚合和性能等問題。

作者:Zachary_Fan
出處:http://www.cnblogs.com/Zachary-Fan/p/CsharpGraphql.html

如果你想及時得到個人自寫文章的消息推送,歡迎掃描下面的二維碼~。

記一次通過c#運用GraphQL調(diào)用Github api

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。

網(wǎng)頁標(biāo)題:記一次通過c#運用GraphQL調(diào)用Githubapi-創(chuàng)新互聯(lián)
標(biāo)題鏈接:http://chinadenli.net/article34/dhpose.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)網(wǎng)站排名、搜索引擎優(yōu)化云服務(wù)器、網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)