2012-03-20 152 views
0

我再次使用了一些BlackBerry的建議。我正在開發一個基於REST的應用程序,使用附加到URI連接字符串的標準BB代碼(如果你願意,我會發布,但不想佔用空間,因爲我懷疑那些知道這個知道你的人正是我的意思)。設備上的黑莓HttpConnection失敗

該代碼在MDS模式下的模擬器中工作正常,並且在直接WiFi中也可以在手機上使用。

現在,問題是我在實際的手機上使用3G時。那時它失敗了。這是一種轉碼問題嗎?

我正在使用原始HttpConnection。

HTTP POST的工作原理(帶有正文信息),但GET(使用cookie作爲auth目的作爲頭requestproperty)失敗。

失敗僅基於移動設備上非WiFi連接的基於頭(GET)的信息。

任何建議將不勝感激。

public static String httpGet(Hashtable params, String uriIn) { 

     String result = null; 

     LoginDetails loginDetails = LoginDetails.getInstance(); 

     HttpConnection _connection; 

     String uri = uriIn + "?api_key=" + loginDetails.getApi_key(); 

     Enumeration e = params.keys(); 

     // iterate through Hashtable keys Enumeration 
     while (e.hasMoreElements()) { 
      String key = (String) (e.nextElement()); 
      String value = (String) params.get(key); 

      uri += "&" + key + "=" + value; 

     } 

     uri = uri + HelperMethods.getConnectionString(); 

     try { 

      _connection = (HttpConnection) Connector.open(uri); 

      _connection.setRequestMethod(HttpConnection.GET); 
      _connection.setRequestProperty("Content-Type", 
        "text/plain; charset=UTF-8"); 

      _connection.setRequestProperty("x-rim-authentication-passthrough", 
        "true"); 

      _connection.setRequestProperty("Cookie", loginDetails.getCookie()); 

      _connection.setRequestProperty("Content-Type", "application/json"); 

      String charset = "UTF-8"; 

      _connection.setRequestProperty("Accept-Charset", charset); 
      _connection.setRequestProperty("Content-Type", 
        "application/x-www-form-urlencoded;charset=" + charset); 

      OutputStream _outputStream = _connection.openOutputStream(); 

      int rc = _connection.getResponseCode(); 

      InputStream _inputStream = _connection.openInputStream(); 

      ByteArrayOutputStream bytestream = new ByteArrayOutputStream(); 
      int ch; 
      while ((ch = _inputStream.read()) != -1) { 

       bytestream.write(ch); 

      } 

      result = new String(bytestream.toByteArray()); 

      bytestream.close(); 


      { 

       if (_outputStream != null) 
        try { 
         _outputStream.close(); 
        } catch (Exception e1) { 
        } 
       if (_connection != null) 
        try { 
         _connection.close(); 
        } catch (Exception e2) { 
        } 

      } 

     } catch (IOException e3) { 

      // TODO Auto-generated catch block 
      e3.printStackTrace(); 
     } 

     return result; 

    } 

而這種用途:

public synchronized static String getConnectionString() { 

     String connectionString = null; 

     // Simulator behaviour is controlled by the USE_MDS_IN_SIMULATOR 
     // variable. 
     if (DeviceInfo.isSimulator()) { 

      connectionString = ";deviceside=true"; 
     } 

     // Wifi is the preferred transmission method 
     else if (WLANInfo.getWLANState() == WLANInfo.WLAN_STATE_CONNECTED) { 

      connectionString = ";interface=wifi"; 
     } 

     // Is the carrier network the only way to connect? 
     else if ((CoverageInfo.getCoverageStatus() & CoverageInfo.COVERAGE_DIRECT) == CoverageInfo.COVERAGE_DIRECT) { 

      String carrierUid = getCarrierBIBSUid(); 

      if (carrierUid == null) { 
       // Has carrier coverage, but not BIBS. So use the carrier's TCP 
       // network 

       connectionString = ";deviceside=true"; 
      } else { 
       // otherwise, use the Uid to construct a valid carrier BIBS 
       // request 

       connectionString = ";deviceside=false;connectionUID="+carrierUid + ";ConnectionType=mds-public"; 
      } 
     } 

     // Check for an MDS connection instead (BlackBerry Enterprise Server) 
     else if ((CoverageInfo.getCoverageStatus() & CoverageInfo.COVERAGE_MDS) == CoverageInfo.COVERAGE_MDS) { 

      connectionString = ";deviceside=false"; 
     } 

     // If there is no connection available abort to avoid hassling the user 
     // unnecssarily. 
     else if (CoverageInfo.getCoverageStatus() == CoverageInfo.COVERAGE_NONE) { 
      connectionString = "none"; 

     } 

     // In theory, all bases are covered by now so this shouldn't be reachable.But hey, just in case ... 
     else { 

      connectionString = ";deviceside=true"; 
     } 



     return connectionString; 
    } 

    /** 
    * Looks through the phone's service book for a carrier provided BIBS 
    * network 
    * 
    * @return The uid used to connect to that network. 
    */ 
    private synchronized static String getCarrierBIBSUid() { 
     ServiceRecord[] records = ServiceBook.getSB().getRecords(); 
     int currentRecord; 

     for (currentRecord = 0; currentRecord < records.length; currentRecord++) { 
      if (records[currentRecord].getCid().toLowerCase().equals("ippp")) { 
       if (records[currentRecord].getName().toLowerCase() 
         .indexOf("bibs") >= 0) { 
        return records[currentRecord].getUid(); 
       } 
      } 
     } 

     return null; 
    } 
+0

請顯示您的代碼。 – 2012-03-20 22:07:41

+0

修改後顯示代碼 – delfi 2012-03-20 22:46:37

+0

您實際獲得的是哪種故障?請顯示實際的錯誤。另外,爲什麼在發送請求前多次將請求「Content-Type」設置爲不同的值?您不能在GET請求中發送任何主體數據,因此根本沒有意義甚至設置「Content-Type」,因爲沒有內容。 URL的字符集由服務器決定,而不是HTTP標頭。 – 2012-03-21 00:21:02

回答

1

固定 - 見上面。

事實證明,在uri中有空格。

相當爲什麼這個工作在WiFi &不是3G等仍然令人費解。