Используйте Java для чтения из службы REST - PullRequest
3 голосов
/ 16 августа 2011

Я пытаюсь выяснить, как читать из REST-источника, который требует аутентификации и безуспешно. У меня это работает нормально, используя C # следующим образом:

HttpWebRequest request = (HttpWebRequest) WebRequest.Create(filename);
request.Accept = "application/xml";
request.ContentType = "application/xml";
request.KeepAlive = true;

// this part is not used until after a request is refused, but we add it anyways
CredentialCache myCache = new CredentialCache();
myCache.Add(new Uri(filename), "Basic", new NetworkCredential(username, password));
request.Credentials = myCache;

// this is how we put the uname/pw in the first request
string cre = String.Format("{0}:{1}", username, password);
byte[] bytes = Encoding.ASCII.GetBytes(cre);
string base64 = Convert.ToBase64String(bytes);
request.Headers.Add("Authorization", "Basic " + base64);

HttpWebResponse response = (HttpWebResponse) request.GetResponse();
return response.GetResponseStream();

Но для Java не работает следующее:

URL url = new URL(dsInfo.getFilename());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Accept", "application/xml");
conn.setRequestProperty("Content-Type", "application/xml");
BASE64Encoder encoder = new BASE64Encoder();
String encodedCredential = encoder.encode( (dsInfo.getUsername() + ":" + dsInfo.getPassword()).getBytes() );
conn.setRequestProperty("Authorization", "BASIC " + encodedCredential);

conn.connect();

InputStream responseBodyStream = conn.getInputStream();

Поток возвращается:

Error downloading template

Packet: test_packet
Template: NorthwindXml

Error reading authentication header.

Что я не так делаю?

спасибо - Дейв

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

В вашей кодировке логин / пароль:

Java использует кодировку UTF-8, а getBytes () возвращает байты, соответствующие кодировке локального хоста (кто может быть ASCII или нет). Javadoc String дает вам больше деталей.

Напечатайте значения таких закодированных строк как в c #, так и в Java и проверьте, совпадают ли они.

1 голос
/ 17 августа 2011

Ответ пришел от Codo в комментарии - Basic вместо BASIC.

...