C# WebRequest:查询字符串数据与x-www-form-urlencoded内容

C# WebRequest:查询字符串数据与x-www-form-urlencoded内容,c#,query-string,webrequest,C#,Query String,Webrequest,我正试图按照以下说明调用Google的OAuth2身份验证服务: 我将所有必需的参数放入查询字符串并发送请求。这适用于“获取用户代码”部分,但不适用于“获取访问和刷新令牌”部分 在反复尝试并得到400个错误的请求之后,我发现,您可以使用FormUrlEncodedContent创建一个请求,而不是将数据放入查询字符串中,并使用application\x-www-form-urlencoded内容类型作为内容发送数据 以下是之前的代码: var requestMessage = new HttpR

我正试图按照以下说明调用Google的OAuth2身份验证服务:

我将所有必需的参数放入查询字符串并发送请求。这适用于“获取用户代码”部分,但不适用于“获取访问和刷新令牌”部分

在反复尝试并得到400个错误的请求之后,我发现,您可以使用FormUrlEncodedContent创建一个请求,而不是将数据放入查询字符串中,并使用application\x-www-form-urlencoded内容类型作为内容发送数据

以下是之前的代码:

var requestMessage = new HttpRequestMessage();
requestMessage.Method = "POST";
requestMessage.RequestUri = new Uri(fullUrl);
其中fullUrl类似于:

https://accounts.google.com/o/oauth2/device/code?client_id=812741506391-h38jh0j4fv0ce1krdkiq0hfvt6n5amrf.apps.googleusercontent.com&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email%20https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile
新的代码是:

var requestMessage = new HttpRequestMessage();
requestMessage.Method = "POST";
requestMessage.RequestUri = new Uri(url);
requestMessage.Content = new FormUrlEncodedContent(CreateDictionary(queryStringNames, queryStringValues));
其中url为:

https://accounts.google.com/o/oauth2/device/code
queryStringNames和queryStringValues是所需参数的名称和值的字符串数组


这两种方法有什么区别?假设所有POST调用都可以使用URL编码的内容请求,而不是将数据放入查询字符串中,这样安全吗?

一般来说,POST请求不需要查询字符串,但仍受服务器逻辑实现的约束。对于OAuth,这是一个众所周知的标准,并且它们遵循良好的实践,使用表单编码的数据是安全的,除非API中明确提到将参数作为查询字符串发送

查询字符串和Post数据是两组不同的参数。若服务器需要查询字符串,那个么您必须只发送查询字符串。这完全取决于服务器端逻辑的实现方式。你不能交替使用它们。大多数API文档都清楚地指定了他们期望的内容