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);
        }

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


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);

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);

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));
}

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


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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.