2013-12-12 76 views
0

我正在尝试使用最近由外部公司开发的外部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

编辑:

+0

您是否尝试过使用像Fiddler这样的工具来捕获Java代码中的工作跟踪,并从您的工作跟踪中查看差异?另外 - 代码中的“请求”是什么?你能展示一个更完整的例子吗? –

+0

@BrianReischl发表了更多代码。我会用提琴手看一看,看看我可能会错过什么。 – Dredj

+0

看起来你的任何尝试都应该工作,假设一个正确的用户名和密码。希望Fiddler会提供更多的信息。 –

回答

0
public void SetBasicAuthHeader(WebRequest req, String userName, String userPassword) 
{ 
    string authInfo = userName + ":" + userPassword; 
    authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); 
    req.Headers["Authorization"] = "Basic " + authInfo; 
} 

从拉基于评论。

HttpRequestMessage requestMsg = new HttpRequestMessage(); 
string data = username + ":" + password; 
requestMsg.Headers.Authorization = new AuthenticationHeaderValue("Basic", data); 
+0

这基本上是我已经在做的事情(请参阅编辑),但它似乎没有工作。 – Dredj

+0

与OP的问题中的代码有什么不同 –

+0

编码类型有所不同。什么是请求的编码,你明确地设置ASCII ... –

相关问题