F# 向 graphql 端点发出 API 请求

时间:2021-04-26 18:30:09

标签: f# graphql

我尝试使用 F# 从 grqphql 端点获取一些数据。 我使用 Fsharp.Data

let apiQuery = """query findData {
                  apiData(Model:{
                                 PageNumber: 1,
                                 PageSize: 100
                                 })
                                 {
                                  ErrorMessage Success ValidationResult TotalCount
                                  Data{
                                      ItemId
                                       }
                                  }
                                 }"""

let queryGraphQl () = 
  Http.RequestString
    ( apiUrl,
      headers = [ ContentType HttpContentTypes.Json;
        Authorization ("bearer " + token)
        ],
      body =
        TextRequest apiQuery
     )

但我得到 (500) Internal Server Error

在 Python 中同样可以正常工作:

query_headers = {
          "Authorization": 'bearer %s' % token,
          'Content-Type': 'application/json'
           }

response = requests.post(url, json={'query': apiQuery},  headers=query_headers)

对我缺少的东西有什么建议吗?

在邮递员中我必须添加 Content-Length 和 Host 喜欢在发送请求时计算。

1 个答案:

答案 0 :(得分:0)

看起来 F# 和 Python 代码并不等效。 Python 代码在负载中包含额外的 query 关键字。

我不知道您的特定端点的具体情况,但我使用公共接口之一编写了类似的代码。

open System.Net
open FSharp.Data
open FSharp.Data.HttpRequestHeaders


let key = "********-****-****-****-*************"
let uri k = $"https://api.everbase.co/graphql?apikey={k}"
let gurl = uri key


let apiQuery = """{ "query" : 
                       "{ client { ipAddress { country { name } city { name } } } }"
                  }"""


let connectToGraph apiUrl apiQuery = 
    try
        let res = Http.RequestString( url = apiUrl, httpMethod="POST", body = TextRequest apiQuery, headers = [ ContentType HttpContentTypes.Json; UserAgent "mozilla" ])
        
        res
    with
    | _ as ex -> ex.Message

[<EntryPoint>]
let main argv =
    let res = connectToGraph gurl apiQuery
    printf "Response: %A" res
    0

我想您应该使用 query 将 F# 代码中的 ':' 与定义的其余部分分开。此外,实际的负载应该用引号/双引号括起来以形成有效的 Json 值。