【发布时间】:2013-12-12 16:59:18
【问题描述】:
我正在尝试使用最近由外部公司开发的外部 REST api。他们为我提供了一些 Java 代码来展示如何连接到它并检索数据,但到目前为止,我无法通过 C# MVC 4 获得任何结果。目前我什至无法登录系统。凭据是正确的,使用我在其他地方找到的示例似乎没有帮助。
有效的 Java 代码:
try{
ClientConfig client_config = new ClientConfig();
client_config.register(new HttpBasicAuthFilter(username,password));
Client client = ClientBuilder.newClient(client_config);
WebTarget web_target = client.target(url);
Invocation.Builder invocation_builder = web_target.request();
//This GET does the login with basic auth
this.populateFromResponse(invocation_builder.get());
}
catch(final Exception e){
System.out.println(e.toString());
}
好的,这里有一些我在 C# 中没有的对象,很明显,但我尝试过的所有方法都没有奏效。
我已尝试将信息放在请求的标头中:
request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes(username + ":" + password));
没有cookie,也试过了:
request.Credentials = new NetworkCredential(username, password);
什么都没有。如果我尝试这个,没有收到 cookie,并且仍然尝试访问 api 的任何其他部分,那么我会收到 401(未授权)错误。如果我只是尝试访问 api 的登录部分,request.GetResponse(); 不会引发错误。
我是 REST 服务的新手,因此感谢您提供任何帮助/指导。我只是问,因为我查找的其他所有内容似乎都不起作用。
编辑 以下是我构建请求的方式:
var request = (HttpWebRequest)WebRequest.Create(HostUrl + path);
request.Method = "GET";
request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes(username + ":" + password));
var response = request.GetResponse() as HttpWebResponse;
编辑#2 感谢@BrianP 的回答,这让我更好地解决了这个问题。下面是我当前的代码(以及从 this question 获取的响应中收集 cookie 的附加内容),最终返回了成功代码:
var cookies = new CookieContainer();
var handler = new HttpClientHandler();
handler.CookieContainer = cookies;
var client = new HttpClient(handler);
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes(username + ":" + password)));
client.BaseAddress = new Uri(HostUrl);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = client.GetAsync(HostUrl + "/api/login/").Result;
var responseCookies = cookies.GetCookies(new Uri(HostUrl)).Cast<Cookie>()
请告诉我此代码是否有改进。再次感谢!
【问题讨论】:
-
您是否尝试过使用 Fiddler 之类的工具从 Java 代码中捕获工作跟踪,并从您的代码中捕获非工作跟踪以查看差异?另外-您的代码中的
request是什么?你能举一个更完整的例子吗? -
@BrianReischl 发布了更多代码。我会和 fiddler 一起看看,看看我可能缺少什么。
-
假设您的用户名和密码正确,您的任何尝试都应该有效。希望 Fiddler 能提供更多信息。
-
您确定它使用的是基本身份验证,而不是基于表单的自定义身份验证吗?
-
@jvenema API 的开发者告诉我这是基本的身份验证。我有一个他们提供的用户名/密码,用于登录他们的 api 并访问它。
标签: c# asp.net-mvc rest