C# 中的 WebRequests 到 REST API 服务器
WebRequests in C# to a REST API server
我对 WebRequests 完全陌生。我需要实施几个 WebRequests 以从服务器接收 json 文件。从服务器我知道:
身份验证:
Authentication of each request is done via a token. The system administrator will provide you with
your token, which must be used with each request. The token should be kept secure (like a
password) as it gives anyone in it's possession with the full access that the associated user would
have.
Headers
Standard HTTP headers may be used to facilitate connection keep-alive, caching, compression etc.
All requests require the following headers
Accept: application/json
Authorization: < authentication token >
我搜索了示例并找到了一个我尝试过的 WebRequest 实现:
public string LoadHttpPageWithBasicAuthentication(string url, string username, string password)
{
Uri myUri = new Uri(url);
WebRequest myWebRequest = HttpWebRequest.Create(myUri);
HttpWebRequest myHttpWebRequest = (HttpWebRequest)myWebRequest;
myHttpWebRequest.Method = "GET";
myHttpWebRequest.ContentType = ".json";
NetworkCredential myNetworkCredential = new NetworkCredential(username, password);
CredentialCache myCredentialCache = new CredentialCache();
myCredentialCache.Add(myUri, "Basic", myNetworkCredential);
myHttpWebRequest.PreAuthenticate = true;
myHttpWebRequest.Credentials = myCredentialCache;
WebResponse myWebResponse = myWebRequest.GetResponse();
Stream responseStream = myWebResponse.GetResponseStream();
StreamReader myStreamReader = new StreamReader(responseStream, Encoding.Default);
string pageContent = myStreamReader.ReadToEnd();
responseStream.Close();
myWebResponse.Close();
return pageContent;
}
我称它为
string ret=Request.LoadHttpPageWithBasicAuthentication(@"https://epica.ecninside.ecn.nl/lots", "aaa", "ccc");
File.WriteAllText("c:\MyTransfer\content.html", ret);
不幸的是,我的内容总是正常的登录页面,而不是任何有用的数据。如果我使用浏览器,这个登录页面也会首先出现。登录后,我收到数据。但是我怎样才能让我的客户在 C# 中处理整个过程呢?
这里有几件事。
您是在下载 JSON 文件,还是服务器实际上直接向您发送 JSON?无论哪种方式,您的内容类型都是错误的。如果服务器响应 JSON,您的内容类型应该是 application/json
。如果它实际上向您发送了一个包含 JSON 的文本文件,您的内容类型应该是 text/plain
.
接下来,他们的文档说每个请求都需要接受 header。所以需要加一行:
myHttpWebRequest.Accept = "application/json";
最后,他们说每个请求都需要一个令牌一起发送。我怀疑这就是为什么您的请求返回登录页面而不是您怀疑的数据的原因。通常使用令牌代替 user/pass,因此 HTTP 基本身份验证在这种情况下是否有效值得怀疑。我先试试这个:
myHttpWebRequest.Headers.Add("Authorization", "your_token");
请先看看我对creating a new REST server的建议:
- 不要使用下一个路径,尝试使用简单的服务和操作列表。
- 不要使用高级 HTTP 操作,如果操作是 URL 的一部分,GET 和 POST 应该足够了。
- 不要将 HTTP 错误代码用于您的应用程序错误代码,这可能会引起混淆,并会阻止您返回复杂的错误代码和部分成功。
- 将您的 API 描述公开为 XML 以启用客户端库生成,例如 Kaltura。
您还可以找到实现这些原则的 C# 服务器实现 example。
我对 WebRequests 完全陌生。我需要实施几个 WebRequests 以从服务器接收 json 文件。从服务器我知道:
身份验证:
Authentication of each request is done via a token. The system administrator will provide you with your token, which must be used with each request. The token should be kept secure (like a password) as it gives anyone in it's possession with the full access that the associated user would have.
Headers
Standard HTTP headers may be used to facilitate connection keep-alive, caching, compression etc. All requests require the following headers
Accept: application/json
Authorization: < authentication token >
我搜索了示例并找到了一个我尝试过的 WebRequest 实现:
public string LoadHttpPageWithBasicAuthentication(string url, string username, string password)
{
Uri myUri = new Uri(url);
WebRequest myWebRequest = HttpWebRequest.Create(myUri);
HttpWebRequest myHttpWebRequest = (HttpWebRequest)myWebRequest;
myHttpWebRequest.Method = "GET";
myHttpWebRequest.ContentType = ".json";
NetworkCredential myNetworkCredential = new NetworkCredential(username, password);
CredentialCache myCredentialCache = new CredentialCache();
myCredentialCache.Add(myUri, "Basic", myNetworkCredential);
myHttpWebRequest.PreAuthenticate = true;
myHttpWebRequest.Credentials = myCredentialCache;
WebResponse myWebResponse = myWebRequest.GetResponse();
Stream responseStream = myWebResponse.GetResponseStream();
StreamReader myStreamReader = new StreamReader(responseStream, Encoding.Default);
string pageContent = myStreamReader.ReadToEnd();
responseStream.Close();
myWebResponse.Close();
return pageContent;
}
我称它为
string ret=Request.LoadHttpPageWithBasicAuthentication(@"https://epica.ecninside.ecn.nl/lots", "aaa", "ccc");
File.WriteAllText("c:\MyTransfer\content.html", ret);
不幸的是,我的内容总是正常的登录页面,而不是任何有用的数据。如果我使用浏览器,这个登录页面也会首先出现。登录后,我收到数据。但是我怎样才能让我的客户在 C# 中处理整个过程呢?
这里有几件事。
您是在下载 JSON 文件,还是服务器实际上直接向您发送 JSON?无论哪种方式,您的内容类型都是错误的。如果服务器响应 JSON,您的内容类型应该是 application/json
。如果它实际上向您发送了一个包含 JSON 的文本文件,您的内容类型应该是 text/plain
.
接下来,他们的文档说每个请求都需要接受 header。所以需要加一行:
myHttpWebRequest.Accept = "application/json";
最后,他们说每个请求都需要一个令牌一起发送。我怀疑这就是为什么您的请求返回登录页面而不是您怀疑的数据的原因。通常使用令牌代替 user/pass,因此 HTTP 基本身份验证在这种情况下是否有效值得怀疑。我先试试这个:
myHttpWebRequest.Headers.Add("Authorization", "your_token");
请先看看我对creating a new REST server的建议:
- 不要使用下一个路径,尝试使用简单的服务和操作列表。
- 不要使用高级 HTTP 操作,如果操作是 URL 的一部分,GET 和 POST 应该足够了。
- 不要将 HTTP 错误代码用于您的应用程序错误代码,这可能会引起混淆,并会阻止您返回复杂的错误代码和部分成功。
- 将您的 API 描述公开为 XML 以启用客户端库生成,例如 Kaltura。
您还可以找到实现这些原则的 C# 服务器实现 example。