2016-09-06 13 views
1

私はAPIを呼び出してデータを取得するreact/reduxアプリケーションを実装しています。 APIはF#で書かれ、Suave.ioを使用します。私のバックエンドでは、いくつかのAPI呼び出しのために、DataSet(.NET Type)を返します。複数の列を持つ多くのDataTableが含まれています。これらの列の名前はデータベースからのものです。 APIからデータをフェッチするとき、Suave.ioはJSONとしてMIMEタイプを設定しているので、データセットを受け取り、jsonオブジェクトとしてビューに渡します。ビューには、列名がデータベースの名前に設定されているDataTableを除いて、すべてのデータが正しく表示されます。たとえば、名前が "IND.APPL"の場合、ビューでは "inD.APPL"になります。私はなぜこれが起こっているのか分かりません。WebServer JSONオブジェクトの応答変更キー名

グラブデータをバックエンドに

コール:

export function loadIndicesDataAPI(data) { 
    return function(dispatch) { 
     dispatch(beginAjaxCall()); 
     return fetch(`http://localhost:8083/indices`, { 
      method: 'post', 
      header: { 
       'Accept': 'application/json', 
       'Content-Type': 'application/json', 
      }, 
      body: JSON.stringify(data), 
     }) 
     .then(response => { 
      return response.json(); 
     }) 
     .then(dataRes => { 
      dispatch(loadIndicesDataSuccess(dataRes)); 
     }).catch(error => { 
      dispatch(ajaxCallError(error)) 
      throw(error); 
     }); 
    }; 
} 

サーブAPIのコードスニペット:

type indicesForm = JsonProvider<""" { "data": [{ "shortName": "s", "name": "n", "symbolId": 1, "isAdded": true, "isDatabase": true, "isReturn": false }], "startdate": "2010-01-01", "enddate": "2011-01-01", "rebalance": 0, "observationAnalysis": 1 } """> 

[<AutoOpen>] 
module RestFul = 

    type RestInit = { 
    RefreshAPI : IndexItem [] * DateTime * DateTime * int * int -> DataSet 
    } 

let JSON v = 
    let jsonSerializerSettings = new JsonSerializerSettings() 
    jsonSerializerSettings.ContractResolver <- new CamelCasePropertyNamesContractResolver() 

    JsonConvert.SerializeObject(v, jsonSerializerSettings) 
    |> OK 
    >=> Writers.setMimeType "application/json; charset=utf-8" 

let fromJson<'a> json = 
    let indicesFormJson = indicesForm.Parse(json) 
    let indexItems = Array.init (indicesFormJson.Data.Length) (fun ind -> 
    let data = indicesFormJson.Data.[ind] 
    let indexItemNew = new IndexItem(data.SymbolId, data.Name, data.ShortName, data.IsReturn) 
    if data.IsAdded then indexItemNew.Add() 
    if data.IsDatabase then indexItemNew.Imported() 
    indexItemNew) 
    let startDate = indicesFormJson.Startdate 
    let endDate = indicesFormJson.Enddate 
    let rebalance = indicesFormJson.Rebalance 
    let observationAnalysis = indicesFormJson.ObservationAnalysis 
    indexItems, startDate, endDate, rebalance, observationAnalysis 

let getResourceFromReq<'a> (req : HttpRequest) = 
    let getString rawForm = 
    System.Text.Encoding.UTF8.GetString(rawForm) 
    req.rawForm |> getString |> fromJson<'a> 

let restInit resourceName resource = 
    let resourcePath = "/" + resourceName 
    path resourcePath >=> choose [ 
    POST >=> request (getResourceFromReq >> resource.RefreshAPI >> JSON) 
    ] 


[<EntryPoint>] 
let main argv = 
    let indicesWebPart = restInit "indices" { 
    RestInit.RefreshAPI = RefreshAPI 
    } 

    startWebServer defaultConfig (choose [indicesWebPart]) 
    0 

他の事は、列名は大文字で始めると、彼らは下ケースになるということですフロントエンド。

答えて

1

私はここにいくつかの問題があると思います...種類...と反応/還元はではないと思っていますが、のようにデータをプルしていますが、データをプッシュしています。 Imは推測:

jsonSerializerSettings.ContractResolver <- new CamelCasePropertyNamesContractResolver() 

は、関連するものですさておき

だから、doucmentation f.i.を読んでください。 http://www.newtonsoft.com/json/help/html/contractresolver.htm私は、CamelCasePropertyNamesContractResolver以外のものを選択することも可能だと思います。

上記の質問は、「私がドキュメントに目を通さなかったことによる名前付けはなぜですか、それ以外は何か迷っていますか?

+0

ありがとうございます。あなたはどのように反応/還元でデータを引き出すのですか? IND.AAPL - > inD.AAPLはまだCamelCaseですか? – Kafo

+0

@HusseinAlkaf私は実際には知りませんが、私が言ったように、データをプッシュし、サーバーから送信されたデータ(クライアント上)に「購読する」という考えがあると思いました。私はもう言わない方がいい。少なくとも私が何かを読んで試してみるまで;-) –