2012-03-20 109 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等仍然令人费解。