使用 HttpGET 的 RestSharp 方法 AddParameter 和 AddQueryParameter 之间的区别
Difference between RestSharp methods AddParameter and AddQueryParameter using HttpGET
我正在使用 RestSharp 调用外部 API。
这个有效:
var client = new RestClient(apiUrl);
var request = new RestRequest(myurl, Method.GET);
foreach (var param in parameters)
{
request.AddQueryParameter(param.Key, param.Value);
}
var response = client.Execute(request);
这不是:
var client = new RestClient(apiUrl);
var request = new RestRequest(myurl, Method.GET);
foreach (var param in parameters)
{
request.AddParameter(param.Key, param.Value);
}
var response = client.Execute(request);
导致:
System.Exception: API Call MyWebAPIMethod GET: Failed with status code
0 - Unable to connect to the remote server
AddParameter
和AddQueryParameter
有什么区别?
根据文档,它们在使用 HttpGET 时应该具有相同的功能,并且根据 Fiddler,它们似乎也生成相同的 URL。
回答你的问题
AddQueryParameter
将查询字符串中的参数添加为 ParameterType.QueryString
而 AddParameter(string, object)
将参数添加为 ParameterType.GetOrPost
有关每个参数类型的更多详细信息,请参阅:
GetOrPost
: https://github.com/restsharp/RestSharp/wiki/ParameterTypes-for-RestRequest#getorpost
QueryString
: https://github.com/restsharp/RestSharp/wiki/ParameterTypes-for-RestRequest#querystring
解决您的问题
似乎与参数类型无关,因为抛出的异常似乎表明您甚至没有连接到远程服务器。
确保在两种情况下都传递相同的 apiUrl
/ myUrl
。
回答 OP 和任何可能对这个概念有疑问的人。
我花了一段时间才明白这个概念。
您可能需要可视化 RESTful 标准,即如何在 url 中构造 GET 请求消息,而不是构造 POST 请求消息。
您会注意到对于 GET ,参数附加到 URL header
而对于 POST ,参数放置在消息的 body 中。
RestSharp 的方法 AddQueryParameter() 只会在消息的 header 中添加(查询)参数,而 AddParameter() 只会将参数添加到消息 body 中。如下所示,GET 有一个值为 "Flavours" 的查询参数。对于 POST ,参数 contact_name 和 company_name 位于消息的底部 body.
例如:
获取消息格式:
获取 http://www.consumerdiarydemo.cbrnetwork.test.au/api/ConsumerDiary/getSizesOrFlavours/Flavours HTTP/1.1
主持人:www.consumerdiarydemo.cbrnetwork.test.au
连接:keep-alive
接受:application/json
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML,如 Gecko)Chrome/58.0.3029.110 Safari/537.36
推荐人:http://www.consumerdiarydemo.cbrnetwork.test.au/ConsumerDiaryPage2template
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
POST 消息格式:
POST
http://localhost:1234567/api/customers HTTP/1.1
接受:application/json、text/javascript、/; q=0.01
X-Requested-With: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded;字符集=UTF-8
{"contact_name":"value_data1","company_name":"value_data2"}
我正在使用 RestSharp 调用外部 API。
这个有效:
var client = new RestClient(apiUrl);
var request = new RestRequest(myurl, Method.GET);
foreach (var param in parameters)
{
request.AddQueryParameter(param.Key, param.Value);
}
var response = client.Execute(request);
这不是:
var client = new RestClient(apiUrl);
var request = new RestRequest(myurl, Method.GET);
foreach (var param in parameters)
{
request.AddParameter(param.Key, param.Value);
}
var response = client.Execute(request);
导致:
System.Exception: API Call MyWebAPIMethod GET: Failed with status code 0 - Unable to connect to the remote server
AddParameter
和AddQueryParameter
有什么区别?
根据文档,它们在使用 HttpGET 时应该具有相同的功能,并且根据 Fiddler,它们似乎也生成相同的 URL。
回答你的问题
AddQueryParameter
将查询字符串中的参数添加为 ParameterType.QueryString
而 AddParameter(string, object)
将参数添加为 ParameterType.GetOrPost
有关每个参数类型的更多详细信息,请参阅:
GetOrPost
: https://github.com/restsharp/RestSharp/wiki/ParameterTypes-for-RestRequest#getorpost
QueryString
: https://github.com/restsharp/RestSharp/wiki/ParameterTypes-for-RestRequest#querystring
解决您的问题
似乎与参数类型无关,因为抛出的异常似乎表明您甚至没有连接到远程服务器。
确保在两种情况下都传递相同的 apiUrl
/ myUrl
。
回答 OP 和任何可能对这个概念有疑问的人。 我花了一段时间才明白这个概念。 您可能需要可视化 RESTful 标准,即如何在 url 中构造 GET 请求消息,而不是构造 POST 请求消息。
您会注意到对于 GET ,参数附加到 URL header 而对于 POST ,参数放置在消息的 body 中。 RestSharp 的方法 AddQueryParameter() 只会在消息的 header 中添加(查询)参数,而 AddParameter() 只会将参数添加到消息 body 中。如下所示,GET 有一个值为 "Flavours" 的查询参数。对于 POST ,参数 contact_name 和 company_name 位于消息的底部 body.
例如:
获取消息格式:
获取 http://www.consumerdiarydemo.cbrnetwork.test.au/api/ConsumerDiary/getSizesOrFlavours/Flavours HTTP/1.1 主持人:www.consumerdiarydemo.cbrnetwork.test.au 连接:keep-alive 接受:application/json User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,如 Gecko)Chrome/58.0.3029.110 Safari/537.36 推荐人:http://www.consumerdiarydemo.cbrnetwork.test.au/ConsumerDiaryPage2template Accept-Encoding: gzip, deflate, sdch Accept-Language: en-GB,en-US;q=0.8,en;q=0.6
POST 消息格式:
POST http://localhost:1234567/api/customers HTTP/1.1 接受:application/json、text/javascript、/; q=0.01 X-Requested-With: XMLHttpRequest Content-Type: application/x-www-form-urlencoded;字符集=UTF-8
{"contact_name":"value_data1","company_name":"value_data2"}