Как проанализировать JSON и urlencoded ответы с Jetty HttpClient?

Пожалуйста, порекомендуйте оптимальный подход для анализа ответов в кодировке urlen или JSON при использовании Jetty HttpClient.

Например, я создал следующий класс утилит для отправки ADM-сообщений и использования BufferingResponseListener там, с UrlEncoded.decodeUtf8To (Для анализа ответа токена на предъявителя) и JSON.parse (для анализа ответа на отправку сообщения):

private final HttpClient mHttpClient;
private final String mTokenRequest;

private String mAccessToken;
private long mExpiresIn;

public Adm(HttpClient httpClient) {
    mHttpClient = httpClient;

    MultiMap<String> params = new MultiMap<>();
    params.add("grant_type", "client_credentials");
    params.add("scope", "messaging:push");
    params.add("client_id", "amzn1.application-oa2-client.XXXXX");
    params.add("client_secret", "XXXXX");
    mTokenRequest = UrlEncoded.encode(params, null, false);
}

private final BufferingResponseListener mMessageListener = new BufferingResponseListener() {
    @Override
    public void onComplete(Result result) {
        if (!result.isSucceeded()) {
            if (result.getResponse().getStatus() % 100 == 4) {
                String jsonStr = getContentAsString(StandardCharsets.UTF_8);
                Map<String, String> resp = (Map<String, String>) JSON.parse(jsonStr);
                String reason = resp.get("reason");
                if ("AccessTokenExpired".equals(reason)) {
                    postToken();
                } else if ("Unregistered".equals(reason)) {
                    // delete the invalid ADM registration id from the database
                }
            }
            return;
        }

        String jsonStr = getContentAsString(StandardCharsets.UTF_8);
        Map<String, String> resp = (Map<String, String>) JSON.parse(jsonStr);
        String oldRegistrationId = (String) result.getRequest().getAttributes().get("registrationID");
        String newRegistrationId = resp.get("registrationID");
        if (newRegistrationId != null && !newRegistrationId.equals(oldRegistrationId)) {
            // update the changed ADM registration id in the database
        }
    }
};

private final BufferingResponseListener mTokenListener = new BufferingResponseListener() {
    @Override
    public void onComplete(Result result) {
        if (result.isSucceeded()) {
            String urlencodedStr = getContentAsString(StandardCharsets.UTF_8);
            MultiMap<String> params = new MultiMap<>();
            UrlEncoded.decodeUtf8To(urlencodedStr, params);
            long now = System.currentTimeMillis() / 1000;
            mExpiresIn = now + Long.parseLong(params.getString("expires_in"));
            mAccessToken = params.getString("access_token");
        }
    }
};

public void postMessage(String registrationId, int uid, String jsonStr) {
    long now = System.currentTimeMillis() / 1000;
    if (mAccessToken == null || mAccessToken.length() < 32 || mExpiresIn < now) {
        postToken();
        return;
    }

    mHttpClient.POST(String.format("https://api.amazon.com/messaging/registrations/%1$s/messages", registrationId))
        .header(HttpHeader.ACCEPT, "application/json")
        .header(HttpHeader.CONTENT_TYPE, "application/json")
        .header(HttpHeader.AUTHORIZATION, "Bearer " + mAccessToken)
        .header("X-Amzn-Type-Version", "com.amazon.device.messaging.ADMMessage@1.0")
        .header("X-Amzn-Accept-Type", "com.amazon.device.messaging.ADMSendResult@1.0")
        .attribute("registrationID", registrationId)
        .content(new StringContentProvider(jsonStr))
        .send(mMessageListener);
}

private void postToken() {
    mHttpClient.POST("https://api.amazon.com/auth/O2/token")
        .header(HttpHeader.ACCEPT, "application/json")
        .header(HttpHeader.CONTENT_TYPE, "application/x-www-form-urlencoded")
        .content(new StringContentProvider(mTokenRequest))
        .send(mTokenListener);
}

Вышеприведенный класс работает нормально, но, увидев, что есть Jetty-методы с InputStream in аргументы, как

UrlEncoded.decodeTo (java.io.InputStream in, карта MultiMap, набор символов java.lang.String, int maxLength, int maxKeys)

а также

JSON.parse (java.io.InputStream in)

Интересно, есть ли более умный способ извлекать и анализировать... может быть, с чем-то более эффективным, чем BufferingResponseListener?

Другими словами, мой вопрос:

Как использовать "потоковую" версию вышеописанных методов анализа с HttpClient?

0 ответов

Другие вопросы по тегам