如何防止 RestSharp 对包含结束引号的字符串进行双重转义?

How can I prevent RestSharp from double escaping a string containing end quotes?

我正在使用 RestSharp 来使用基于 PHP 的休息 API (magento)。我 运行 遇到一个问题,我的 request.Content 包含一个用反斜杠转义的字符串。像这样:"\"mystringIsEscaped\""。它应该只是一个普通的字符串 "mystringIsNotEscaped"

API 没有对双引号进行任何特殊处理。 JSON 响应如下所示:

{
 "value": 1
}

"SomeValueAsJustString"

到目前为止,这是我的代码:

// PART 1: Getting an Unauthorized Request Token
var request = new RestRequest("/rest/V1/integration/admin/token", Method.POST);
request.AddJsonBody(new {username = "this.adminUserName", password = "this.adminPassword"});
request.AddHeader("content-type", "application/json");

var _client = new RestClient(_url);
var _jsonSerializer = new JsonSerializer();

_client.AddDefaultHeader(_contentTypeHeaderWithUnderscore ? "Content_Type" : "Content-Type", "application/json");
_client.ClearHandlers(); // 
_client.AddHandler("application/json", _jsonSerializer);

var response = _client.Execute(request);

response.Content 被双重转义。

我的原始响应(使用 fiddler)如下所示:

HTTP/1.1 200 OK
Server: nginx/1.17.1
Date: Mon, 22 Jul 2019 12:38:44 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Set-Cookie: PHPSESSID=873l8qhalaltets0tpa2s2sta1; expires=Mon, 22-Jul-2019 13:38:44 GMT; Max-Age=3600; path=/; domain=dev.myurlthatimhiding.org; HttpOnly
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
X-Frame-Options: SAMEORIGIN
Vary: Accept-Encoding
Content-Length: 34

"mysecuretokenstringthatimnotshowing"

如何让 RestSharp 不进行双重编码,或者更具体地说,如何正确处理返回的双引号?

在PHP 端生成响应。正如您在 fiddler 中看到的那样,双引号来自 PHP 一侧,而不是由 RestSharp 插入。

内容类型是由PHP服务生成的响应是:

Content-Type: application/json; charset=utf-8

所以应该是JSON。

通常,JSON 数据更长且结构化。但它对 return 只是一个字符串也有效。而在JSON中,字符串必须用双引号括起来。

反斜杠是调试器的产物。我假设您正在使用 Visual Studio。它以在源代码中出现的方式显示所有字符串。在源代码中你会写:

var t = "\"mysecuretokenstringthatimnotshowing\"";

因此不包含反斜杠,无论是在响应中还是在字符串中。这只是调试器显示。

JSON 的用法很奇怪。但它是有效的。只需删除字符串开头和结尾的双引号即可。

看起来 Execute() 给你的内容是一个字符串,它会用双引号引起来。要反序列化,您需要提供一个类型:

var response = request.Execute<string>();
var token = response.Content;

link