Как отправить запрос POST, если одно из свойств в теле запроса имеет знак «@»? - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь отправить запрос POST в Microsoft Graph API для создания вкладки Sharepoint. Согласно документам , мне нужно отправить HTTP-запрос на https://graph.microsoft.com/v1.0/teams/{team-id}/channels/{channel-id}/tabs, используя этот формат:

{
  "displayName": "SharePoint",
  "teamsApp@odata.bind": "https://graph.microsoft.com/v1.0/appCatalogs/teamsApps/2a527703-1f6f-4559-a332-d8a7d288cd88"
}

Я пытаюсь следовать тому, что было предложено в другом вопросе StackOverflow ( Как сделать веб-запрос HTTP POST ), используя:

public static async Task CreateSharepointTab(string teamsID, string channelId)
{
    var responseString = await $"https://graph.microsoft.com/v1.0/teams/{teamsID}/channels/{channelId}/tabs"
        .PostUrlEncodedAsync(new { displayName = "Sharepoint tab", teamsApp @odata.bind = "https://graph.microsoft.com/v1.0/appCatalogs/teamsApps/2a527703-1f6f-4559-a332-d8a7d288cd88" })
        .ReceiveString();
}

Так что teamsApp@odata.bind в качестве имени свойства возвращает ошибку из-за знака @. Как я могу избежать этого / обойти это и должным образом передать это моему запросу POST так, чтобы это было принято?

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Метод PostUrlEncodedAsync() Flur будет POST объект как application/x-www-form-urlencoded, а не application/json (это то, что требует Graph). Для этого вы хотите использовать PostJsonAsync().

Что касается имени свойства, C# не поддерживает @ в качестве имени свойства. Вам нужно будет отправить его в виде строки (или JObject, как предложил RB).

var responseString = await $"https://graph.microsoft.com/v1.0/teams/{teamsID}/channels/{channelId}/tabs"
    .PostJsonAsync("{ \"displayName\" = \"Sharepoint tab\", \"teamsApp@odata.bind\" = \"https://graph.microsoft.com/v1.0/appCatalogs/teamsApps/2a527703-1f6f-4559-a332-d8a7d288cd88\" }")
    .ReceiveString();

Все это говорит о том, что вы должны избавить себя от много головных болей и избегать рук создание HTTP-вызовов к Graph с использованием Microsoft Graph. NET SDK . Он обрабатывает все биты оркестровки и сериализации для вас.

0 голосов
/ 18 марта 2020

Один простой подход - просто не использовать причудливые методы расширения и самостоятельно создавать больше запросов.

Например

var body = new JObject(); // JSON.Net is pulled into your application via Flurl anyway.
body["displayName"] = "SharePoint";
body["teamsApp@odata.bind"] = "https://graph.microsoft.com/v1.0/appCatalogs/teamsApps/2a527703-1f6f-4559-a332-d8a7d288cd88";

// Construct the content yourself. Make sure you set the correct content type: 
// It's probably "application/x-www-form-urlencoded"
var content = new StringContent(
    body.ToString(), 
    Encoding.UTF8,
    "application/x-www-form-urlencoded");

// Now do a simple POST.
var result = await "http://example.org".PostAsync(content);

Возможно, вам понадобится такой инструмент, как Fiddler, чтобы Захватите хороший HTTP-запрос и убедитесь, что вы не пропустили ни одного важного заголовка или чего-то подобного, но вы не ошибетесь go в этом.

...