Wiep Corbier Ответов: 1

Удалить отсутствующие кавычки 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[^]

1 Ответов

Рейтинг:
2

Wiep Corbier

Найти решение. Заметьте, он не имел никакого отношения ни к почтальону, ни к скрипачу. Вот что я имею в виду: мой код не работает, мне нужен код, который работает.
(но г-г, Спасибо за усилия и время. :-) )

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "DELETE";
            request.ContentType = "application/json";
            request.Accept = "application/json";

            using (var streamWriter = new StreamWriter(request.GetRequestStream()))
            {
                streamWriter.Write(data);
                streamWriter.Flush();
            }

            using (var httpResponse = (HttpWebResponse)request.GetResponse()) { message = httpResponse.StatusCode.ToString(); }


Graeme_Grant

Ах, значит, я был прав, тебе нужно было использовать DeleteAsync и нет PostAsync .. Рад, что он разобран.

Wiep Corbier

Нет, в предыдущем коде DeleteAsync не работает. Я же не дура.

Graeme_Grant

DeleteAsync добавляет request.Method = "DELETE";- Вы использовали его? PostAsync что добавляет request.Method = "POST";.

Wiep Corbier

Я знаю, что в коде написано PostAsync, но я также попробовал DeleteAsync. Я много чего перепробовал, но ничего не вышло. Вот почему я разместил эту проблему здесь. Но. Я также опубликовал решение, и я хочу оставить его на этом. Спасибо снова.