Java - 消息头值中存在非法字符: Basic

7

当我尝试使用HttpUrlConnection在Java中查询api时,出现以下错误:

    "Exception in thread "main" java.lang.IllegalArgumentException: Illegal   character(s) in message header value: Basic MTk2YTVjODdhNWI2YjFmNWE3ZmQ5ODEtYjFjYTEzZmUtM2FkNC0xMWU1LWEyZjAtMDBkMGZlYTgy
NjI0OmY3NDQ2ZWQ0YjhjNzI2MzkyMzY1YzczLWIxY2ExNjQ4LTNhZDQtMTFlNS1hMmYwLTAwZDBm
ZWE4MjYyNA=="

这是我的代码:
public class LocalyticsTest {

        public static void main(String[] args) throws UnsupportedEncodingException {

            String apiKey = "MyKey";
            String apiSecret = "MySecretKey";
            String apiUrl = "https://api.localytics.com/v1/query";
            String credentials = apiKey + ":" + apiSecret;
            //String encoding = Base64.encode(apiKey.getBytes("UTF-8"));
            //String encoding2 = Base64.encode(apiSecret.getBytes("UTF-8"));
            String encoding3 = new sun.misc.BASE64Encoder().encode (credentials.getBytes("UTF-8"));

            String appId = "myAppId";
            String metric = "sessions";
            String dimensions = "day";
            String condition = "'{\"day\":[\"between\",\"'.$newDate.'\",\"'.$newDate.'\"]}'";
            Map data = new HashMap();
            data.put("app_id", appId);
            data.put("metric", metric);
            data.put("dimensions", dimensions);
            data.put("condition", condition);

            QueryEncoder q = new QueryEncoder();
            String newData = q.toQueryString(data);

            String newUrl = String.format("%s?%s", apiUrl, newData);


            try{
                URL url = new URL(newUrl);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                //conn.setRequestMethod("GET");
                //conn.setRequestProperty("Authorization", "Basic");
                //conn.setRequestProperty(apiKey,apiSecret);
                conn.setRequestProperty("Authorization", "Basic " + encoding3);
                conn.setRequestProperty("Accept", "application/vnd.localytics.v1+hal+json");


                if (conn.getResponseCode() != 200) {
                    throw new RuntimeException("Failed : HTTP error code : "
                            + conn.getResponseCode());
                }

                BufferedReader br = new BufferedReader(new InputStreamReader(
                        (conn.getInputStream())));

                String output;
                System.out.println("Output from Server .... \n");
                while ((output = br.readLine()) != null) {
                    System.out.println(output);
                }

                conn.disconnect();

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (ProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
       }
    }

关于 IT 技术的问题,以下是用 Curl 在 php 中使其正常工作的代码:

function call_localytics_api($method, $url, $data)
{
    $curl = curl_init();
    $url = sprintf("%s?%s", $url, http_build_query($data));
    $api_key = "myKey";
    $api_secret = "mySecret";
    // Optional Authentication:
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($curl, CURLOPT_USERPWD, $api_key . ":" . $api_secret);
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    // Disable the SSL verificaiton process
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array("Accept: application/vnd.localytics.v1+hal+json"));

    // Confirm cURL gave a result, if not, write the error

    $response = curl_exec($curl);

    if ($response === FALSE) {
        die("Curl Failed: " . curl_error($curl));
    } else {
        return $response;
    }
}

$api_querystring = "https://api.localytics.com/v1/query";
$app_id = "myAppId";

$metric = "sessions";
$dimensions = "day";
//$data = array(app_id => $app_id, metrics => $metric, dimensions => $dimensions, conditions => '{"day":["in","'.$requestDate.'"]}');
$data = array(app_id => $app_id, metrics => $metric, dimensions => $dimensions, conditions => '{"day":["between","'.$newDate.'","'.$newDate.'"]}');
$response = call_localytics_api('GET', $api_querystring, $data);
$json = json_decode($response);
print_r($json);

只需要帮助将它在Java中运行。

1个回答

11

看起来非法字符是一个换行符。使用不会在结果中添加换行符的base64编码器,或者自己删除换行符。

从Java 8开始,您应该使用:

String encoding3 = Base64.getEncoder().encodeToString(
    credentials.getBytes(StandardCharsets.UTF_8));
在旧版的Java中,您可以使用DatatypeConverter
String encoding3 = DatatypeConverter.printBase64Binary(
    credentials.getBytes(StandardCharsets.UTF_8));

您也可以直接删除换行符,但您应该使用上述方法之一。sun.*类不适用于开发使用,并且它们可能会在一个Java版本中更改或消失。此外,据我所知,在Java 9中,它们可能甚至无法使用,而不管它们是否存在,由于模块限制。


非常感谢! - Anand Varkey Philips

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接