如何防止 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;
我正在使用 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;