我正在尝试使用最近由外部公司开发的外部REST api。他们为我提供了一些Java代码来展示如何连接它并检索数据,但到目前为止,我没有运用C#MVC 4获得任何结果。目前我甚至无法登录系统。凭据是正确的,并且使用我在其他地方找到的示例似乎没有帮助。使用外部REST api进行身份验证
的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));
没有饼干,也试过:
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>()
请让我知道如果这是你的代码的改进。再次感谢! http://blog.kowalczyk.info/article/at3/Forcing-basic-http-authentication-for-HttpWebReq.html
编辑:
您是否尝试过使用像Fiddler这样的工具来捕获Java代码中的工作跟踪,并从您的工作跟踪中查看差异?另外 - 代码中的“请求”是什么?你能展示一个更完整的例子吗? –
@BrianReischl发表了更多代码。我会用提琴手看一看,看看我可能会错过什么。 – Dredj
看起来你的任何尝试都应该工作,假设一个正确的用户名和密码。希望Fiddler会提供更多的信息。 –