2016-05-11 7 views
1

Ich erhalte die folgende Fehlermeldung, wenn eine api in Java unter Verwendung von HttpURLConnection abzufragen versuchen:Java - Illegales Zeichen (s) im Message-Header-Wert: Grund

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

Hier ist mein Code:

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

ich bin in der Lage, um es mit dem folgenden in pHP mit Locke zu funktionieren:

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

Nur müssen helfen, sie den Weg zur Arbeit in Java.

Antwort

1

Es scheint, dass das ungültige Zeichen ein Zeilenumbruch ist. Verwenden Sie einen Basis-64-Encoder, der keine Zeilenumbrüche in das Ergebnis einfügt, oder entfernen Sie den Zeilenumbruch selbst.

Ab Java 8, sollten Sie verwenden:

String encoding3 = Base64.getEncoder().encodeToString(
    credentials.getBytes(StandardCharsets.UTF_8)); 

In älteren Versionen von Java, können Sie DatatypeConverter:

String encoding3 = DatatypeConverter.printBase64Binary(
    credentials.getBytes(StandardCharsets.UTF_8)); 

Sie können auch das Newline-Zeichen direkt entfernen, aber Sie sollten Verwenden Sie stattdessen einen der obigen Ansätze. Die sun. * -Klassen sind nicht für Entwicklungszwecke gedacht und können sich von einer Java-Version zur nächsten ändern oder verschwinden. Darüber hinaus sind sie, wie ich es verstehe, aufgrund von Moduleinschränkungen möglicherweise gar nicht mehr von Java 9 verwendbar, unabhängig davon, ob sie existieren oder nicht.

+0

Das hat funktioniert. Danke – teej2542

+0

Vielen Dank! –

+0

Angenommen, es ist noch nicht codiert ... – Andrew