【问题标题】:Are Microsoft Graph calls to PATCH (update) a list items fields case sensitive?Microsoft Graph 调用 PATCH(更新)列表项字段是否区分大小写?
【发布时间】:2020-05-05 02:29:25
【问题描述】:

尝试调用 Microsoft 图形上的更新项 API 端点时,字段名称似乎区分大小写。 https://docs.microsoft.com/en-us/graph/api/listitem-update?view=graph-rest-1.0&tabs=http 此处的文档并未说明这一点。对 /fields 端点的调用是否区分大小写?

我正在尝试更新名为“Status”的单行文本字段(内部名称和显示名称都是“Status”(大写首字母 S)。当调用 /v1.0/sites/{id} /lists/{id}/item{id}/fields 来自 Graph Explorer 的端点,调用失败:

{
    "status":"testing"
}

返回以下内容。

{
    "error": {
        "code": "invalidRequest",
        "message": "Field 'status' is not recognized",
        "innerError": {
            "request-id": "8700ae5d-f2e5-4138-891a-f980630aa7d1",
            "date": "2020-05-02T15:30:14"
        }
    }
}

但是,如果 PATCH 请求的正文如下:

{
    "Status":"testing"
}

调用成功并返回正在更新的项目、所有字段和正确更新的“状态”字段。

鉴于我直接从 C# 调用 API(使用 HttpClient 而未使用 SDK,因此 FieldValueSet 不是此处的选项)并使用 CamelCasePropertyNamesContractResolver 和以下代码为 JsonSerializerSettings 使用:

var request = new HttpRequestMessage(method, $"{graphEndpoint}{version}{uri}");

if (!string.IsNullOrEmpty(body))
{
    request.Content = new StringContent(body, Encoding.UTF8, "application/json");
}

var response = await _httpClient.SendAsync(request);

并且身体总是驼峰式的并且失败了。这是一个错误吗?如果没有,什么被认为是更好的做法,因为我尝试过的大多数事情(JObject 和其他人)似乎真的是回补黑客。

【问题讨论】:

    标签: sharepoint microsoft-graph-api


    【解决方案1】:

    这是quite some time 的 SharePoint API 的一个已知问题。 SharePoint Graph APIs 中有一个相关的错误,特别是 Graph camel 将列名大小写。

    【讨论】:

    • 谢谢马克。那么问题是,如果这是一个已知错误,是否有任何推荐的方法来解决该问题或 ETA 进行修复?
    • 我不知道有任何解决方法或预计到达时间,但由于至少从 2012 年就已经存在,我预计不会在短期内修复。
    • 再次感谢马克。我在下面为任何寻找答案的人提供了我的工作。感谢您的回复!
    【解决方案2】:

    对于那些寻找最终答案的人,我正在使用以下内容。

    在类中,我定义了一个默认和驼峰式大小写解析器。

    private readonly JsonSerializerSettings camelCaseJsonSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() };
    private readonly JsonSerializerSettings defaultJsonSettings = new JsonSerializerSettings { ContractResolver = new DefaultContractResolver() };
    

    在进行调用的方法中,我现在只是根据 Http 方法和包含 SharePoint 的 uri 选择要使用的设置。

    if (body != null && (method != HttpMethod.Get || method != HttpMethod.Delete))
    {
       if ((method != HttpMethod.Post) && (uri.Contains("/sites/"))) 
       {
          // Serialize the body to be pascal cased due to SP Bug
          payload = JsonConvert.SerializeObject(body, defaultJsonSettings);
       }
       else
       {
         // Serialize the body with camelCasing 
         payload = JsonConvert.SerializeObject(body, camelCaseJsonSettings);
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-11
      • 1970-01-01
      • 2014-01-19
      • 2011-11-23
      • 2020-08-29
      • 2011-11-16
      相关资源
      最近更新 更多