Azure http函数和DocumentDB

时间:2017-08-21 04:04:16

标签: azure azure-functions azure-cosmosdb

尝试构建一些简单的http Azure功能。可以从包含JSON主体的Web应用程序中获取POST,并将其另存为CosmosDB(DocumentDB)中的文档。另一个发送带有参数的GET请求,该参数从数据库中读取该文档并将其作为JSON返回。

我的DocumentDB集合全部设置好并准备就绪。

我发现每个接近的例子都会有一些细微的差别,比如输出到队列,所以这个例子不是我需要的。

2 个答案:

答案 0 :(得分:2)

  

尝试构建一些简单的http Azure功能。可以从包含JSON主体的Web应用程序中获取POST,并将其另存为CosmosDB(DocumentDB)中的文档。

要从HttpTrigger Azure功能应用程序在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

  

另一个发送带有参数的GET请求,该参数从数据库中读取该文档并将其作为JSON返回。

要从Cosmos DB检索数据并通过Azure功能应用程序将其作为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

答案 1 :(得分: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,则可以使用任何类型的对象执行此操作。

此代码段的重要部分是JsonConvert.SerializeObject(response),它将实际序列化为JSON格式。