Исключительная десериализация JSON с Newtonsoft, отправленная CURL в функцию Azure - PullRequest
0 голосов
/ 27 сентября 2018

При публикации в моем API с использованием CURL я использую следующий синтаксис:

curl -H "Content-Type:application/json" -X POST -d '{"domainName":"fabrikam.onmicrosoft.com","apiKey":"980709a87df09a78dsf90a8s7f"}' http://localhost:7071/api/getnodedata

Мой веб-API получает запрос через:

dynamic data = await req.Content.ReadAsAsync<object>();
NodeModel nodeData = Newtonsoft.Json.JsonConvert.DeserializeObject<NodeModel>(data);

Мой класс прост:

public class NodeModel : TableEntity
{
    public string DomainName { get; set; }
    public string ApiKey { get; set; }
}

public static NodeModel(string DomainName, string ApiKey)
{
    this.PartitionKey = DomainName;
    this.RowKey = ApiKey;
}

Проверка data дает мне '{domainName:fabrikam.onmicrosoft.com,apiKey:980709a87df09a78dsf90a8s7f}', что выглядит нормально, за исключением пропущенных двойных кавычек вокруг каждой пары ключ / значение.CURL удаляет двойные кавычки перед отправкой (как проверено с помощью трассировки Fiddler).

В моем локальном приложении func.exe получено следующее исключение:

mscorlib: Exceptionпри выполнении функции: GetNodeData.Newtonsoft.Json: Ошибка при разборе логического значения.Путь 'имя_домена'

Я пробовал:

  1. Пробелы между ключом / значениями
  2. Одинарные кавычки, заключающие ключи (ключи)
  3. Одинарные кавычки, заключающие значение (я)
  4. Исследование сайта Newtonsoft на предмет правильного синтаксиса
  5. Исследование этого сайта для других примеров (которые, похоже, не отличаются от того, что яделать).

Есть предложения или инструкции по использованию другого инструмента?У меня тоже есть Fiddler, но я не использовал его для POST передачи данных в службу.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Обобщение комментариев в ответе ...

  1. Использование Fiddler - это отличный инструмент, но он работает как прокси-сервер на ваших машинах.Различные инструменты не будут учитывать системные настройки, и curl является одним из них..NET HttpClient такой же.Поэтому вы должны указать ему использовать прокси с --proxy (или -x для короткой опции:

    curl -H "Content-Type: application/json" -X POST -d '...snip...' http://localhost:7071/api/getnodedata -x http://localhost:8888
    
  2. curl убирает двойные кавычки.чтобы обойти это, вам нужно использовать двойные кавычки для окружения ваших данных и экранировать внутренние кавычки с обратной косой чертой:

    -d "{\"domainName\": \"fabrikam.onmicrosoft.com\", \"apiKey\": \"980709a87df09a78dsf90a8s7f\"}"
    
  3. Я бы вообще не рекомендовал использовать curl для тестирования APIЭто отличный инструмент, но, как вы уже видели, его неудобно использовать. Вместо этого я рекомендую использовать Почтальон .

  4. Бонус! Ваш C #код тоже немного искажен. Либо считайте данные в виде строки и передайте их в JSON.Net:

    string data = await req.Content.ReadAsStringAsync();
    NodeModel nodeData = Newtonsoft.Json.JsonConvert.DeserializeObject<NodeModel>(data);
    

    Или, что еще лучше, позвольте уже используемому расширению сделать работу за вас:

    NodeModel nodeData = await req.Content.ReadAsAsync<NodeModel>();
    
0 голосов
/ 27 сентября 2018

Попробуйте это:

curl -H "Content-Type:application/json" -X POST -d "{\"domainName\":\"fabrikam.onmicrosoft.com\",\"apiKey\":\"980709a87df09a78dsf90a8s7f\"}" 
 http://localhost:7071/api/getnodedata
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...