Служба REST API возвращает JSON, но Chrome с двойным кодированием - PullRequest
1 голос
/ 01 апреля 2020

Я написал свою первую службу REST API через мое ASP. Net 4.5.2 веб-приложение, которое принимает JSON данные (через POST) и возвращает JSON данные.

Когда я вызываю службу с помощью PowerShell, возвращаемое значение JSON точно соответствует требуемому, а использование $returnData | ConvertTo-Json работает, как и ожидалось, позволяя получить доступ к объекту ...

 {"result":"ok"}

Но когда я вызываю службу с помощью RestMan для Chrome результат выглядит как двойное кодирование ...

 "{\"result\":\"ok\"}"

Я также проверил инструменты разработчика в Chrome, и на вкладке ответа показано это двойное значение -кодирование, несмотря на заголовок ответа, содержащий Content-Type: application/json; charset=utf-8 ..., который говорит мне, что это не проблема с RestMan, но мое внутреннее чувство заключается в том, что это также не проблема с Chrome.

Я указал точку останова на последнем Return в коде, и возвращаемая строка определенно верна ... она не закодирована дважды.

Я специально не устанавливаю тип содержимого. Net кажется, что делает это для меня, но я попытался установить его через HttpContext.Current.Response.ContentType d это не имеет значения.

Что я делаю не так?!

1 Ответ

1 голос
/ 01 апреля 2020

Может показаться, что у вас есть два слоя кодировки JSON: один уже сделан вашими инструментами (ASP. NET и Invoke-RestMethod в PowerShell), а другой - вручную.

Сторона сервера:

  1. У вас есть объект, содержащий ключ result со значением ok.
  2. Вы вызываете JsonSerializer.Serialize для этого объекта , превращая его в строку (JSON строка, представляющая объект): {"result":"ok"}
  3. Вы возвращаете эту строку из вашего метода обработчика запроса.
  4. ASP. NET ваше значение и сериализует его в JSON (снова ! ), превращая его в другую строку (строку JSON, представляющую другую строку JSON, представляющую объект): "{\"result\":\"ok\"}"
  5. Эти данные с двойным кодированием передаются по проводам и возвращаются в HTTP-запросе.

На стороне клиента:

  1. PowerShell получает необработанную строку "{\"result\":\"ok\"}" с вашего сервера.
  2. Поскольку тип контента application/json, функция Invoke-RestMethod десериализует его для вас, Res ulting в новом строковом значении {"result":"ok"}, которое является исходными данными, возвращаемыми вашим обработчиком запросов (JSON строка, представляющая ваш объект)
  3. Вы вызываете ConvertFrom-Json для этой строки, десериализовав ее во второй раз в результате получается объект, содержащий ключ result и значение ok.

Вы видите, если бы вы не выполняли ни сериализацию, ни ручную десериализацию своих данных, а просто возвращали объект и обрабатывали $returnData также как объект (поскольку ваши инструменты на обоих концах провода в любом случае уже позаботятся об этом за вас), вы получите тот же результат, но вы получите ожидаемую некодированную строку JSON сверх провод вместо дважды закодированного, который вы видите сейчас.

...