good Morning to everyone, I have this problem: I need to do a API auth with java, i have this example in C#:
protected async override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
    HttpResponseMessage response = null;
    string requestContentBase64String = string.Empty;
    string requestUri = HttpUtility.UrlEncode(request.RequestUri.AbsoluteUri.ToLower());
    string requestHttpMethod = request.Method.Method;
    DateTime epochStart = new DateTime(1970, 01, 01, 0, 0, 0, 0, DateTimeKind.Utc);
    TimeSpan timeSpan = DateTime.UtcNow - epochStart;
    string requestTimeStamp = Convert.ToUInt64(timeSpan.TotalSeconds).ToString();
    ASCIIEncoding encoder = new ASCIIEncoding();
    Byte[] code = encoder.GetBytes(APIKey);
    HMACSHA256 hmSha1 = new HMACSHA256(code);
    Byte[] hashMe = encoder.GetBytes(requestTimeStamp);
    Byte[] hmBytes = hmSha1.ComputeHash(hashMe);
    request.Headers.Add("APIKey", APPId);
    request.Headers.Add("Nonce", requestTimeStamp);
    request.Headers.Add("Signature", ToHexString(hmBytes));
    response = await base.SendAsync(request, cancellationToken);
    return response;
}
And my example in java is:
public String amx_authorization_header(String funcao) throws UnsupportedEncodingException, IOException, InvalidKeyException, NoSuchAlgorithmException {
    //Definições de funcao, ID e password para acessar a API
    String endereco = "https://broker.negociecoins.com.br/tradeapi/v1/" + funcao;
    String urlString = URLEncoder.encode(endereco, "UTF-8").toLowerCase();
    String ID = "youID";
    String pass = "Youpass";
    String result = "";
    URL url;
    BufferedReader reader = null;
    String requestContentBase64String = "";
    HttpsURLConnection urlConnection = null;
    //Configurações para acesso a URL
    System.out.println("URL: " + urlString);
    url = new URL(endereco);
    urlConnection = (HttpsURLConnection) url.openConnection();
    urlConnection.setRequestMethod("GET");
    urlConnection.setConnectTimeout(5000);
    //Calculando UNIX Time: Gerando um requestTimeStamp
    Date epochStart = new Date(1970 - 1900, 01, 01, 01, 01, 01);
    //epochStart.set(1970 + 1900, 01, 01, 01, 01, 01);
    //epochStart.setTimeZone(TimeZone.getTimeZone("UTC"));
    System.out.println("epochStart: " + epochStart.toString());
    String requestTimeStamp = "" + ((new Date().getTime() - epochStart.getTime()) / 1000);
    System.out.println("TimeStamp: " + requestTimeStamp);
    //Gerando um Nonce
    Integer n = new Random().nextInt(10000000);
    String nonce = n.toString();
    System.out.println("Nonce: " + nonce.toString());
    String signatureRawData = String.format("%s%s%s%s%s%s", ID, urlConnection.getRequestMethod(),
            urlString, requestTimeStamp, nonce, "");
    System.out.println("SignatureRawData: " + signatureRawData);
    //Tratamento do password para SHA256
    //BASE64Decoder decoder = new BASE64Decoder();
    //pass.getBytes(StandardCharsets.UTF_8);
    byte[] secretKeyByteArray = Base64.getDecoder().decode(pass.getBytes(StandardCharsets.UTF_8));
    //ArrayList<byte> teste = new ArrayList();
    int semsinal[] = new int[secretKeyByteArray.length];
    for(int i = 0; i<secretKeyByteArray.length;i++){
    //System.out.println("Unsigned byte: " + (secretKeyByteArray[i] & 0xFF));
    semsinal[i] = secretKeyByteArray[i] & 0xFF;
    }
    byte[] signature = signatureRawData.getBytes("UTF-8");
    Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
    SecretKeySpec secret_key = new SecretKeySpec(secretKeyByteArray, "HmacSHA256");
    sha256_HMAC.init(secret_key);
    byte[] signatureBytes = sha256_HMAC.doFinal(signature);
    String requestSignatureBase64String = Base64.getEncoder().encodeToString(signatureBytes);
    System.out.println("requestSignatureBase64String: " + requestSignatureBase64String);
    //Preparando HEADER para ser enviado na autenticação
    String header = String.format("amx %s:%s:%s:%s", ID, requestSignatureBase64String, nonce, requestTimeStamp); //Formato Header
    System.out.println("Formato HEADER: " + header);
    //Envio da autenticação para a Conexão
    urlConnection.setRequestProperty("Authorization", header);
    urlConnection.setRequestProperty("User-Agent", "");
    //urlConnection.connect();
    //Leitura do retorno da API
    reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
    StringBuffer buffer = new StringBuffer();
    int read;
    char[] chars = new char[1024];
    while ((read = reader.read(chars)) != -1) {
        buffer.append(chars, 0, read);
    }
    return buffer.toString();
}
But, the return of authentication in java is: Exception in thread "main" java.io.IOException: Server returned HTTP response code: 401 for URL: https://.......
Someone have one idea of this problem?
