2017-07-31 91 views
0

我正在使用java.net API来请求softlayer API。Softlayer API错误“java.net.SocketException:连接重置”

String url = "https://api.softlayer.com/rest/v3.1/SoftLayer_Account/getInvoices.json"; 
String query = "objectFilter={\"invoices\":{\"createDate\":{\"operation\":\"betweenDate\",\"options\":[{\"name\":\"startDate\",\"value\":[\"04/01/2017 17:50:40\"]},{\"name\":\"endDate\",\"value\":[\"06/01/2017 17:50:40\"]}]}}}"; 
HttpsURLConnection conn = (HttpsURLConnection) new URL(url + "?" + query).openConnection(); 

我得到这个错误

java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(SocketInputStream.java:196) 
    at java.net.SocketInputStream.read(SocketInputStream.java:122) 
    at sun.security.ssl.InputRecord.readFully(InputRecord.java:442) 
    at sun.security.ssl.InputRecord.read(InputRecord.java:480) 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:934) 
    at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:891) 
    at sun.security.ssl.AppInputStream.read(AppInputStream.java:102) 
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:235) 
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:275) 
    at java.io.BufferedInputStream.read(BufferedInputStream.java:334) 
    at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:690) 
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:633) 
    at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:661) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1324) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254) 

我怎样才能解决这个问题?

回答

0

Unfortunetaly 对象过滤尚未在SoftLayer的Java API的客户端来实现,目前有关于这一个开放的问题,请参见:

https://github.com/softlayer/softlayer-java/issues/30

同时,您可以:

借机休息一下请求如下,以检索所需信息:

https://[username]:[apiKey]@api.softlayer.com/rest/v3.1/SoftLayer_Account/getInvoices?objectFilter={"invoices":{"createDate":{"operation":"betweenDate","options":[{"name":"startDate","value":["04/01/2017 17:50:40"]},{"name":"endDate","value":["06/01/2017 17:50:40"]}]}}} 

检索getInvoices结果,然后使用自己的代码对其进行过滤;或使用任何其他的SoftLayer API客户支持的编程语言,请参阅以下内容:

http://sldn.softlayer.com/

1

问题是由于在请求发送的字符,字符,例如[] {}:“”,所有的他们必须编码,要做到这一点,你可以使用方法URLEncoder.encode

URLEncoder.encode(filter,"UTF-8"); 

下面是我用来解决问题的java代码。这个例子是基于https://www.mkyong.com/webservices/jax-rs/restfull-java-client-with-java-net-url/

public static void main(String[] args) { 

     // Define user credentials 
     String username = "set me"; 
     String apikey = "set me"; 

     // Define Service url, method and header params 
     String url = "https://api.softlayer.com/rest/v3.1/SoftLayer_Account/getInvoices.json"; 
     String filter = "{\"invoices\":{\"createDate\":{\"operation\":\"betweenDate\",\"options\":[{\"name\":\"startDate\",\"value\":[\"04/01/2017 17:50:40\"]},{\"name\":\"endDate\",\"value\":[\"06/01/2017 17:50:40\"]}]}}}"; 

     try { 
      String encodedFilter = URLEncoder.encode(filter,"UTF-8"); 

      // Build the URL request 
      URL urlRequest = new URL(url + "?objectFilter=" + encodedFilter); 

      HttpsURLConnection conn = (HttpsURLConnection) urlRequest.openConnection(); 

      // Encode user credentials to Base64 form 
      String authString = username + ":" + apikey; 
      String authStringEnc = new String(Base64.getEncoder().encode(authString.getBytes())); 

      // Add authentication, request method and property 
      conn.setRequestProperty("Authorization", "Basic " + authStringEnc); 
      conn.setRequestMethod("GET"); 
      conn.setRequestProperty("Accept", "application/json"); 


      if (conn.getResponseCode() != 200) { 
       System.out.println("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 (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

谢谢你的回答有没有更多的错误但是结果是错误的ObjectFilter的不负责由SOFTLAYER服务器取,我让所有的发票! – Ioa

+0

我更新了我的答案和示例,调查后发现问题是网址编码。 –

相关问题