2017-08-21 9 views
2

シンプルなhttp Azure関数をいくつか構築しようとしています。 JSON本体を含むWebアプリケーションからPOSTを受け取り、それをCosmosDB(DocumentDB)のドキュメントとして保存します。もう一方はパラメータを指定してGETリクエストを送信し、データベースからそのドキュメントを読み取り、JSONとして返します。Azure http関数とDocumentDB

私はDocumentDBコレクションをすべてセットアップして準備しています。

私が見つけたすべての例は、キューに出力するのと同じように、常に近いところにあることがわかります。その例は私が必要とするものではありません。

答えて

2

シンプルなhttp Azure関数をいくつか構築しようとしています。 JSON本体を含むWebアプリケーションからPOSTを受け取り、それをCosmosDB(DocumentDB)のドキュメントとして保存します。

HttpTrigger Azure関数appからCosmos DBにデータを保存するには、私の側でうまく動作する次のサンプルコードを参照してください。

using System.Net; 

public static HttpResponseMessage Run(HttpRequestMessage req, out object taskDocument, TraceWriter log) 
{ 
    log.Info("C# HTTP trigger function processed a request."); 

    MyData md=req.Content.ReadAsAsync<MyData>().Result; 
    taskDocument = new { 
     name = md.name, 
     task = md.task, 
     duedate = md.duedate 
    }; 


    if (name != "") { 
     return req.CreateResponse(HttpStatusCode.OK); 
    } 
    else { 
     return req.CreateResponse(HttpStatusCode.BadRequest); 
    } 
} 

public class MyData{ 
    public string name { get; set;} 
    public string task { get; set;} 
    public string duedate { get; set;} 
} 

enter image description here

enter image description here

他のデータベースからその文書を読み取り、JSONとして返すパラメータを持つGET要求を送信します。

Cosmos DBからデータを取得し、Azure関数app経由でJSONとして返すには、次のサンプルを参照してください。

function.json

{ 
    "bindings": [ 
    { 
     "authLevel": "function", 
     "name": "req", 
     "type": "httpTrigger", 
     "direction": "in", 
     "route": "documents/{name}" 
    }, 
    { 
     "name": "$return", 
     "type": "http", 
     "direction": "out" 
    }, 
    { 
     "type": "documentDB", 
     "name": "inputDocument", 
     "databaseName": "xxxdocumentdbtest", 
     "collectionName": "testcoll", 
     "sqlQuery": "SELECT * FROM c where c.name = {name}", 
     "connection": "xxxx_DOCUMENTDB", 
     "direction": "in" 
    } 
    ], 
    "disabled": false 
} 

run.csx

#r "Newtonsoft.Json" 
using System.Net; 
using Newtonsoft.Json; 

public static HttpResponseMessage Run(HttpRequestMessage req, IEnumerable<MyData> inputDocument, TraceWriter log) 
{ 
    log.Info("C# HTTP trigger function processed a request."); 

    MyData md = inputDocument.FirstOrDefault(); 

    log.Info(md.task); 

    var val = JsonConvert.SerializeObject(md); 

    return req.CreateResponse(HttpStatusCode.OK, val); 
} 

public class MyData{ 
    public string name { get; set;} 
    public string task { get; set;} 
    public string duedate { get; set;} 
} 

enter image description here

0

JSONをどのように返すべきか尋ねていますか?

これは私のAzure関数の内容です。まず、必要なデータを取得しようとします(GetVotes())。その後、私はこのデータをクライアントに返す形式(CreateResponse())に変更し、JSONにシリアル化しながらクライアントに戻します。

[FunctionName("Status")] 
    public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter logWriter) 
    { 
     Status.log = logWriter; 
     Status.log.Info("C# HTTP trigger function processed a request."); 

     var votes = await GetVotes(); 
     var response = CreateResponse(votes); 

     return req.CreateResponse(HttpStatusCode.OK, JsonConvert.SerializeObject(response)); 
    } 

    private static List<ViewModel.Vote> CreateResponse(IEnumerable<Entities.Vote> votes) 
    { 
     var voteCount = new Dictionary<string, int>(); 
     foreach (var vote in votes) 
     { 
      Status.log.Info($"Found language `{vote.Language}`."); 
      if (voteCount.ContainsKey(vote.Language)) 
      { 
       voteCount[vote.Language]++; 
      } 
      else 
      { 
       voteCount.Add(vote.Language, 1); 
      } 
     } 

     var result = new List<ViewModel.Vote>(); 
     foreach (var languageVotes in voteCount) 
     { 
      result.Add(new ViewModel.Vote(languageVotes.Key, languageVotes.Value)); 
     } 
     return result; 
    } 

もちろん、オブジェクトをJSONにシリアル化することができれば、任意のタイプのオブジェクトでこれを行うことができます。

このスニペットの重要な部分は、実際にJSON形式にシリアル化するJsonConvert.SerializeObject(response)です。

関連する問題