Удалить отсутствующие кавычки API json
Для проекта я получаю данные в формате json, и весь CRUD также находится в json.
При удалении записи мне нужен такой код:
[{ "Id": "1000" }]
Это правильный json. В Postman это работает нормально.
В моем коде я использую такой код:
HttpClient client = new HttpClient(); client.BaseAddress = new Uri(url); byte[] cred = UTF8Encoding.UTF8.GetBytes("username:password"); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(cred)); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); HttpContent content = new StringContent(data, UTF8Encoding.UTF8, "application/json"); HttpResponseMessage responseMessage = client.PostAsync(url, content).Result; return responseMessage.ToString();
Но мое содержание меняется каждый раз.
от
[{ "Id": "1000" }]
к
[{ Id: "1000" }]
Он каким-то образом теряет двойные кавычки и поэтому возвращает 204, и никакая запись не удаляется.
Я изо всех сил пытаюсь понять, как решить эту проблему.
Что я уже пробовал:
Я пробовал все виды манипуляций со строками, но либо у меня не было двойных кавычек, либо две двойные кавычки
любить:
[{ ""Id"": "1000" }]
Graeme_Grant
Как вы создаете данные JSON?
Wiep Corbier
подобный этому:
строковые данные = @"[{" + "\"" + propertyName + "\"" + ": "+ "\"" + @"" + значение + "\"}]";
Одна из проблем для меня-это [ и ] в данном случае.
Может быть, мне просто нужен совершенно другой код.
Кстати: я так и делаю .Сеть и принимающий конец-это PHP.
Они говорят, что api созданы для того, чтобы облегчить жизнь, но если каждый человек делает это по-своему, то легкая часть исчезает :-)
Graeme_Grant
Во-первых, вы не используете дословные строки для простых строк, поэтому вы можете отбросить @s (Подробнее читайте здесь: строка (Справочник по c#) | Майкрософт документы[^]). Дословные строки - это только в том случае, если вы не хотите использовать экранированные строки типа " \ "" - дословно будет@"""".
Для данных JSON следует использовать сериализацию JSON. Подробнее о них вы можете прочитать в этой статье: Работа с JSON в C# и VB[^]
Ваш JSON, который жестко закодирован, выглядит нормально. Что заставляет вас думать, что это не так?
Wiep Corbier
Привет, проблема в том, что: с или без "@"
Вторая моя самая большая проблема в кодировании-заставить людей понять мой вопрос, хотя я думаю, что объясняю его так, как его понимают люди. Но нет :-)
Когда я создаю строку типа:
[{
"Id": "1000"
}]
в Visual Studio я могу проверить, что это такое:
с помощью текстового визуализатора это так:
[{"Id": "4"}]
с XML документ есть:
ничего
в HTML документ есть:
[{"Id": "4"}]
В JSON Visualizer есть:
> [JSON]
> [0]
> Id: "4"
Итак, "ушли", и это приводит к тому, что "нет удаления". (204)
Я не могу сделать это намного более ясным.
Graeme_Grant
Ты слишком пристально на него смотришь. Каждый визуализатор делает это по-своему.
устанавливать Скрипач[^], бегать и подглядывать за движением. Там вы увидите, что на самом деле посылается. Или запишите его в текстовый файл и откройте в блокноте.
Wiep Corbier
Я с нетерпением жду этого, потому что у меня есть проблема, и я не понимаю, как ее решить.
И до сих пор не знаю.
кстати: я использую postman, и это приложение похоже на Fiddler.
Я не совсем то же самое.
Но...может быть, у кого-то другого есть решение. Я понимаю, что ты не понимаешь. :-)
Моя самая большая проблема-заставить людей понять мои вопросы.
Все происходит примерно так:
Привет, как тебя зовут?
Ответьте, хорошо, когда вы идете в Сити-Холл и спрашиваете клерка ... он знает Анвера.
Я: а?
Да, или попробуй моего папу или маму , они знают.
Я: что?
И так все продолжалось и продолжалось.
Graeme_Grant
Что же тогда говорит почтальон?
Что происходит, когда вы отправляете данные? Что видит принимающая сторона?
Кроме того, "вторая моя самая большая проблема в кодировании-это заставить людей понять". Я написал десятки приложений, которые работают с RESTful services, как то, что вы описываете. На самом деле, да, но это не то, что вы хотите услышать. Пожалуйста, найдите время, чтобы прочитать и уважительно общаться, когда вы хотите получить помощь и помощь предлагается. Разработчики жертвуют и жертвуют своим собственным временем бесплатно, чтобы помочь коллегам-разработчикам решить трудности.
Wiep Corbier
Вы: что же тогда говорит почтальон?
Ответ: в Postman это работает нормально.
Я ни в чем вас не виню, я просто сказал вам, что это я не могу заставить вопрос быть понятым.
Graeme_Grant
Ну вот, вы сами ответили на свой вопрос.
Вы слишком пристально смотрите на разные визуализаторы - каждый отображает по-разному. Вы не можете изменить это, кроме как сделать свой собственный для VS.
Wiep Corbier
Именно это я и пытаюсь сделать. :-)
Я пробовал много так;utions и все терпят неудачу.
Вот почему я пришел сюда. Как мое последнее спасение :-)
вы спросили меня: что происходит, когда вы отправляете данные? Что видит принимающая сторона?
Не знаю, наверное, ничего. Код написан кем - то, кто не может ответить, потому что он в отпуске. Вернусь в конце этого месяца.
Я получаю 400 или 204
Graeme_Grant
Не боритесь с тем, что уже есть в инструментах Visual Studio, сопротивление бесполезно ;)
Wiep Corbier
Я ни с чем не борюсь, я просто хочу понять, почему этот парень написал "удалить" таким образом и почему мой код не работает.
Вот и все :-)
Graeme_Grant
Основываясь на приведенном выше коде, похоже, что вы не задали метод (GET/POST/PUT/DELETE/PATCH) выполняемого запроса. По умолчанию используется значение GET, поэтому тело (содержимое), вероятно, игнорируется.
[редактировать] Я все еще использую старый HttpClient (устаревший код). По-прежнему работает в Xamarin (iOS, Android), Mac и Windows... Когда-нибудь я поменяюсь местами.
PostAsync ... так что это установка method = POST, а не DELETE. Вы должны быть в состоянии увидеть это в почтальоне. Вызов HttpClient.Метод DeleteAsync (Uri) (System.Net.Http)[^] вместо.
Wiep Corbier
Парень, который сделал Кок, написал: "используй его так же, как ты используешь почту.
конечно, я также попытался удалить, но это также не работает по причинам, которые я упоминал несколько раз.
Опять же, в Postman это работает нормально. Сообщение, как и ожидалось. Запись удалена.
Давайте просто остановим эту тему, потому что она никуда не ведет.
Я подожду, пока парень вернется из отпуска, и попрошу его написать код, который будет работать на меня.
С меня хватит.
Graeme_Grant
Я могу работать только с тем, чем вы поделились выше. Подробности того, что было опробовано, не упоминаются. Таким образом, вы получите предложения, которые вы, возможно, уже пробовали, а возможно, и нет.
Последняя попытка-сравнить необработанный заголовок и данные как вручную в Postman, так и из кода. Вы увидите, в чем разница. Скрипач делает это легко.
Wiep Corbier
Это не о почтальоне или скрипаче, это мой код, который не работает.
Graeme_Grant
"сравните необработанный заголовок и [необработанные] данные как вручную в Postman, так и из кода." Ответ будет там, в деталях.
Когда одно работает, а другое нет, именно туда я и смотрю.
Wiep Corbier
Мой код дает:
Состояния: 204, ReasonPhrase: 'Содержимое', Версия: 1.1, Содержание: Система.Нет.Протоколу HTTP.StreamContent, Заголовки:
{
Pragma: no-cache
Доступ-Контроля-Разрешить-Происхождение: *
Контроль Доступа-Макс-Возраст: 3628800
Доступ-контроля-разрешить-методы: сделать,пост,удалить
Доступ-контроля-разрешить-заголовки: принять, контент-тип, х-экстра-маркер
Варьировать: User-Agent
Кэш-управления: нет-магазине, необходимо подтвердить, нет-кэша, после проверки=0, предварительно проверить=0
Дата: Пн, 06 нояб. 2017 08:51:05 GMT
Set-Cookie: PHPSESSID=87e3j0f8husifdsrof4oepm5n2; path=/
Сервер: Apache/2
Content-Type: application/json; charset=utf8
Срок действия: чт, 19 ноября 1981 года 08:52:00 GMT
}
Для меня это очень просто, и я не эксперт по json.
Мне нужно добраться
[{
"Id": "1000"
}]
поперек, и я не в состоянии это сделать.
Это все.
Graeme_Grant
Разве в заголовке вашего C# нет длины контента, которая была бы отправлена из POSTMAN?
Wiep Corbier
Я понятия не имею.
Я только знаю, что то, что я посылаю, чем-то испорчено, потому что каким-то образом
[{
"Id": "1000"
}]
преобразуется в
[{
Id: "1000"
}]
Но давайте покончим с этим.
Я не понимаю, в чем моя проблема.
Я не очень хорошо говорю по английски наверное
Извини, но я уже все сделал. Это чертовски расстраивает меня, но я знаю, что это я.
Спасибо за усилия, но ... ..
Не тратьте больше времени на это, мы говорим совершенно на разных языках.
Graeme_Grant
Ответ на обновление: ответ должен содержать сообщение в заголовке или теле. С помощью почтальона вы увидите, что это такое.
400 = Плохой Запрос. Обычно это означает, что в отправленном запросе отсутствуют данные; 204 = нет содержимого - ref: код состояния http[^]