Adicionando cabeçalho para HttpURLConnection

253

Estou tentando adicionar cabeçalho para minha solicitação usando, HttpUrlConnectionmas o método setRequestProperty()não parece funcionar. O lado do servidor não recebe nenhuma solicitação com meu cabeçalho.

HttpURLConnection hc;
    try {
        String authorization = "";
        URL address = new URL(url);
        hc = (HttpURLConnection) address.openConnection();


        hc.setDoOutput(true);
        hc.setDoInput(true);
        hc.setUseCaches(false);

        if (username != null && password != null) {
            authorization = username + ":" + password;
        }

        if (authorization != null) {
            byte[] encodedBytes;
            encodedBytes = Base64.encode(authorization.getBytes(), 0);
            authorization = "Basic " + encodedBytes;
            hc.setRequestProperty("Authorization", authorization);
        }
Minh-Ha Le
fonte
Funciona para mim, como você diz que o cabeçalho foi enviado e não recebido?
Tomasz Nurkiewicz 4/10/12
1
desculpe se isso parece idiota, mas onde você está chamando connect()a URLConnection?
Vikdor 04/10/12
Não tenho certeza se isso tem algum efeito, mas você pode tentar adicionar connection.setRequestMethod("GET");(ou POST ou o que quiser)?
Noobed 04/10/12
1
Você inicializa authorizationcom a cadeia vazia. Se um usernameou passwordfor nulo, authorizationserá a cadeia vazia, não nula. Portanto, a final ifserá executada, mas a "Authorization"propriedade será definida como vazia, me parece.
Zerzevul 12/04/19

Respostas:

422

Eu usei o seguinte código no passado e ele funcionou com a autenticação básica ativada no TomCat:

URL myURL = new URL(serviceURL);
HttpURLConnection myURLConnection = (HttpURLConnection)myURL.openConnection();

String userCredentials = "username:password";
String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userCredentials.getBytes()));

myURLConnection.setRequestProperty ("Authorization", basicAuth);
myURLConnection.setRequestMethod("POST");
myURLConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
myURLConnection.setRequestProperty("Content-Length", "" + postData.getBytes().length);
myURLConnection.setRequestProperty("Content-Language", "en-US");
myURLConnection.setUseCaches(false);
myURLConnection.setDoInput(true);
myURLConnection.setDoOutput(true);

Você pode tentar o código acima. O código acima é para POST e você pode modificá-lo para GET

Cyril Beschi
fonte
15
Uma pequena adição aos desenvolvedores do Android (na API> = 8 aka 2.2): android.util.Base64.encode (userCredentials.getBytes (), Base64.DEFAULT); Base64.DEFAULT diz para usar RFC2045 para codificação base64.
Denis Gladkiy
@ Denis, poderia me dizer por que deveria usar cabeçalhos. Eu tenho que validar algumas credenciais do android eu estou usando php no xammp. como devo ir para isso. como eu não sei como escrever código php com cabeçalhos
Pankaj Nimgade
11
De onde a variável postDataveio no seu exemplo?
precisa saber é o seguinte
22
Por que eles são chamados de "RequestProperty" quando todos os chamam de Cabeçalhos?
Philip Rego
2
Uma adição à versão Java8: a classe Base64 foi um pouco alterada. A decodificação deve ser feita usando:String basicAuth = "Basic " + java.util.Base64.getEncoder().encodeToString(userCredentials.getBytes());
Mihailo Stupar
17

Só porque não vejo essa informação nas respostas acima, o motivo pelo qual o snippet de código publicado originalmente não funciona corretamente é porque a encodedBytesvariável é byte[]um Stringvalor e não um . Se você passar byte[]para a new String()como abaixo, o trecho de código funcionará perfeitamente.

encodedBytes = Base64.encode(authorization.getBytes(), 0);
authorization = "Basic " + new String(encodedBytes);
Joseph Cozad
fonte
11

Se você estiver usando o Java 8, use o código abaixo.

URLConnection connection = url.openConnection();
HttpURLConnection httpConn = (HttpURLConnection) connection;

String basicAuth = Base64.getEncoder().encodeToString((username+":"+password).getBytes(StandardCharsets.UTF_8));
httpConn.setRequestProperty ("Authorization", "Basic "+basicAuth);
Chandubabu
fonte
6

Finalmente isso funcionou para mim

private String buildBasicAuthorizationString(String username, String password) {

    String credentials = username + ":" + password;
    return "Basic " + new String(Base64.encode(credentials.getBytes(), Base64.DEFAULT));
}
gori
fonte
2
@ d3dave. A sequência foi criada a partir da matriz de bytes e concatenada com "Básico". O problema no código OP era que ele concatenou "Basic" com o byte [] e o enviou como cabeçalho.
Yurin
5

Seu código está correto. Você também pode usar a mesma coisa dessa maneira.

public static String getResponseFromJsonURL(String url) {
    String jsonResponse = null;
    if (CommonUtility.isNotEmpty(url)) {
        try {
            /************** For getting response from HTTP URL start ***************/
            URL object = new URL(url);

            HttpURLConnection connection = (HttpURLConnection) object
                    .openConnection();
            // int timeOut = connection.getReadTimeout();
            connection.setReadTimeout(60 * 1000);
            connection.setConnectTimeout(60 * 1000);
            String authorization="xyz:xyz$123";
            String encodedAuth="Basic "+Base64.encode(authorization.getBytes());
            connection.setRequestProperty("Authorization", encodedAuth);
            int responseCode = connection.getResponseCode();
            //String responseMsg = connection.getResponseMessage();

            if (responseCode == 200) {
                InputStream inputStr = connection.getInputStream();
                String encoding = connection.getContentEncoding() == null ? "UTF-8"
                        : connection.getContentEncoding();
                jsonResponse = IOUtils.toString(inputStr, encoding);
                /************** For getting response from HTTP URL end ***************/

            }
        } catch (Exception e) {
            e.printStackTrace();

        }
    }
    return jsonResponse;
}

Seu código de resposta de retorno 200 se a autorização for bem-sucedida

pintu
fonte
1

Com o RestAssurd, você também pode fazer o seguinte:

String path = baseApiUrl; //This is the base url of the API tested
    URL url = new URL(path);
    given(). //Rest Assured syntax 
            contentType("application/json"). //API content type
            given().header("headerName", "headerValue"). //Some API contains headers to run with the API 
            when().
            get(url).
            then().
            statusCode(200); //Assert that the response is 200 - OK
Eyal Sooliman
fonte
1
Você se importa de formatar o código aqui de maneira um pouco mais limpa? Além disso, o que given()deveria ser?
Nathaniel Ford
Oi, Esse é o uso básico do rest-Assurd (testando o resto da API). Eu adicionei explica ao código.
Eyal Sooliman
-1

Etapa 1: Obter o objeto HttpURLConnection

URL url = new URL(urlToConnect);
HttpURLConnection httpUrlConnection = (HttpURLConnection) url.openConnection();

Etapa 2: adicione cabeçalhos à HttpURLConnection usando o método setRequestProperty.

Map<String, String> headers = new HashMap<>();

headers.put("X-CSRF-Token", "fetch");
headers.put("content-type", "application/json");

for (String headerKey : headers.keySet()) {
    httpUrlConnection.setRequestProperty(headerKey, headers.get(headerKey));
}

Link de referência

Hari Krishna
fonte