2

私は Java lib を作成しており、現在ning からasync-http-clientを使用して URL へのリクエストを実行し、そのコンテンツをフェッチする必要があります。したがって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 ライブラリを使用していますか? または、別の方法を使用してそれを行う方法を知っている場合..

どんな助けでも大歓迎です!

4

4 に答える 4

6

あなたは近くにいます。URL エンコードではなく、Base 64 エンコードが必要です。つまり、必要です

String encoded = Base64.getEncoder().encodeToString((user + ':' + password).getBytes(StandardCharsets.UTF_8));

それよりも

String encoded = URLEncoder.encode(token + ":", "UTF-8");

(他の人の利益のために、私は2年後に答えているので、私の答えでは"user:password"、あなたの質問が持っているのに対し、より標準的なものを使用していることに注意してください"token:""token:"問題も?)

自己完結型の短い正しい例を次に示します。

package so17380731;

import com.ning.http.client.AsyncHttpClient;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import javax.ws.rs.core.HttpHeaders;

public class BasicAuth {

    public static void main(String... args) throws Exception {
        try(AsyncHttpClient asyncClient = new AsyncHttpClient()) {
            final String user = "StackOverflow";
            final String password = "17380731";
            final String fetchURL = "https://www.eventick.com.br/api/v1/events/492";
            final String encoded = Base64.getEncoder().encodeToString((user + ':' + password).getBytes(StandardCharsets.UTF_8));
            final String body = asyncClient
                .prepareGet(fetchURL)
                .addHeader(HttpHeaders.AUTHORIZATION, "Basic " + encoded)
                .execute()
                .get()
                .getResponseBody(StandardCharsets.UTF_8.name());
            System.out.println(body);
        }
    }
}
于 2015-05-22T18:40:25.587 に答える
0

これは、基本認証を追加するもう 1 つの方法でもあります。2 つのクラスのいずれかを使用して、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();

それはあなたに役立つかもしれません

于 2014-07-18T13:55:12.387 に答える