POST с HttpURLConnection в Java - PullRequest
0 голосов
/ 04 ноября 2018

У меня возникают проблемы при использовании HttpURLConnection вместо библиотек Apache, следующий код для загрузки токена работает нормально

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

import Decoder.BASE64Encoder;

private void LoadToken(String username, String password, String url) throws Exception {

    SecretKeySpec keySpec = new SecretKeySpec(
            password.getBytes(),
            "HmacMD5");

    String computedHashString = "";
    try {
        Mac mac = Mac.getInstance("HmacMD5");
        mac.init(keySpec);
        byte[] result = mac.doFinal(url.getBytes());

        BASE64Encoder encoder = new BASE64Encoder();
        computedHashString = encoder.encode(result); 

    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        throw new Exception("Can not create token (NoSuchAlgorithmException)");
    } catch (InvalidKeyException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        throw new Exception("Can not create token (InvalidKeyException)");
    }

    HttpPost httpPost = new HttpPost(url);  
    httpPost.setHeader("Authorization", "Bearer " + username + ":" + computedHashString);

    try {
        CloseableHttpResponse response = httpclient.execute(httpPost);
        ObjectMapper objectMapper = new ObjectMapper();
        if(response.getStatusLine().getStatusCode() != HttpStatus.SC_OK){
            RetrieveException(response, objectMapper);
        }

        AccessToken accessToken = objectMapper.readValue(response.getEntity().getContent(), AccessToken.class);
        token = accessToken;
    } 
    catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        throw new Exception("Can not create token (ClientProtocolException)");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        throw new Exception("Can not create token (IOException)");
    }
}

Однако, когда я пытаюсь использовать HttpURLConnection (мне нужно сделать это, чтобы включить его в проект Android), вот так:

private void LoadToken(String username, String password, String uri) throws Exception {

    SecretKeySpec keySpec = new SecretKeySpec(
            password.getBytes(),
            "HmacMD5");

    String computedHashString = "";
    try {
        Mac mac = Mac.getInstance("HmacMD5");
        mac.init(keySpec);
        byte[] result = mac.doFinal(uri.getBytes());

        BASE64Encoder encoder = new BASE64Encoder();
        computedHashString = encoder.encode(result); 

    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        throw new Exception("Can not create token (NoSuchAlgorithmException)");
    } catch (InvalidKeyException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        throw new Exception("Can not create token (InvalidKeyException)");
    }

     URL url = new URL(uri);
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
     urlConnection.setRequestMethod("POST");
     urlConnection.setRequestProperty("Authorization", "Bearer " + username + ":" + computedHashString);


     try {
        ObjectMapper objectMapper = new ObjectMapper();
        AccessToken accessToken = objectMapper.readValue(urlConnection.getInputStream(), AccessToken.class);
        token = accessToken;
    } 
    catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        throw new Exception("Can not create token (ClientProtocolException)");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        throw new Exception("Can not create token (IOException)");
    }
}

Я понял, что сервер отвечает кодом состояния 411. Извините, если это глупый вопрос, но я никогда не использовал HttpURLConnection. Я что-то пропустил? Где я не прав? Заранее спасибо

1 Ответ

0 голосов
/ 04 ноября 2018

Набор urlConnection.setDoOutput(true)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...