我正在编写一个Java库,需要对URL进行请求 - 目前正在使用来自ning的async-http-client - 并获取其内容。所以我有一个返回String的get
方法
获取文档的内容。但是,为了能够获得它,我必须执行HTTP基本身份验证,并且我在Java代码中没有成功:
public String get(String token) throws IOException {
String fetchURL = "https://www.eventick.com.br/api/v1/events/492";
try {
String encoded = URLEncoder.encode(token + ":", "UTF-8");
return this.asyncClient.prepareGet(fetchURL)
.addHeader("Authorization", "Basic " + encoded).execute().get().getResponseBody();
}
}
代码没有返回错误,它只是没有获取URL,因为没有正确设置身份验证标头。
使用curl -u
选项,我可以轻松获得我想要的内容:
curl https://www.eventick.com.br/api/v1/events/492 -u 'xxxxxxxxxxxxxxx:'
返回:
{"events":[{"id":492,"title":"Festa da Bagaceira","venue":"Mangueirão de Paulista",
"slug":"bagaceira-fest", "start_at":"2012-07-29T16:00:00-03:00",
"links":{"tickets":[{"id":738,"name":"Normal"}]}}]}
如何在Java中完成?使用async-http-client lib?或者,如果您知道如何使用其他方式...
欢迎任何帮助!
答案 0 :(得分:5)
你很亲密。您需要基于64位编码而不是URL编码。也就是说,你需要
String encoded = Base64.getEncoder().encodeToString((user + ':' + password).getBytes(StandardCharsets.UTF_8));
而不是
String encoded = URLEncoder.encode(token + ":", "UTF-8");
(请注意,为了其他人的利益,因为我在2年后回答,在我的回答中我使用的是更标准"user:password"
,而您的问题有"token:"
。如果{{1你需要什么,然后坚持下去。但也许这也是问题的一部分?)
这是一个简短,独立,正确的例子
"token:"
答案 1 :(得分:3)
文档非常粗略,但我认为您需要按照Request
javadoc中显示的模式使用RequestBuilder
:
Request r = new RequestBuilder().setUrl("url")
.setRealm((new Realm.RealmBuilder()).setPrincipal(user)
.setPassword(admin)
.setRealmName("MyRealm")
.setScheme(Realm.AuthScheme.DIGEST).build());
r.execute();
(显然,这个例子不是基本身份验证,但有关于如何做到这一点的线索。)
FWIW,您当前代码的一个问题是Basic Auth标头使用base64编码而不是URL编码;有关详细信息,请参阅RFC2617。
答案 2 :(得分:1)
基本上,这样做:
BoundRequestBuilder request = asyncHttpClient
.preparePost(getUrl())
.setHeader("Accept", "application/json")
.setHeader("Content-Type", "application/json")
.setRealm(org.asynchttpclient.Dsl.basicAuthRealm(getUser(), getPassword()))
// ^^^^^^^^^^^-- this is the important part
.setBody(json);
答案 3 :(得分:0)
这也是添加基本授权的另一种方式, 您可以使用两个类中的任何一个来使用AsyncHttpClient,HttpClient,在这种情况下我将使用AsyncHttpClient
AsyncHttpClient client=new AsyncHttpClient();
Request request = client.prepareGet("https://www.eventick.com.br/api/v1/events/492").
setHeader("Content-Type","application/json")
.setHeader("Authorization","Basic b2pAbml1LXR2LmNvbTpnMGFRNzVDUnhzQ0ZleFQ=")
.setBody(jsonObjectRepresentation.toString()).build();
添加标题部分后
ListenableFuture<Response> r = null;
//ListenableFuture<Integer> f= null;
try{
r = client.executeRequest(request);
System.out.println(r.get().getResponseBody());
}catch(IOException e){
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
client.close();
它可能对你有用