【问题标题】:Connecting to a db using REST interface: Cannot connect使用 REST 接口连接到数据库:无法连接
【发布时间】:2012-01-10 23:04:00
【问题描述】:

我正在尝试通过我正在开发的 android 应用程序中的 mongolabs REST 接口连接到 mongodb,但它没有连接,而是抛出异常(或者至少我认为是)。我对后端不熟悉,所以如果我犯了一个致命的菜鸟错误,请原谅我。这是日志猫

01-10 16:28:50.377: W/System.err(630): javax.net.ssl.SSLException: 证书中的主机名不匹配:!= OR OR >01-10 16:28:50.377 : W/System.err(630): 在 org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:185) 01-10 >16:28:50.388: W/System.err(630):在 org.apache.http.conn.ssl.BrowserCompatHostnameVerifier.verify(BrowserCompatHostnameVerifier.java:54)

下面是我编写的 MongoLabHelper 类的一部分,用于访问数据库并获取名称等项目

HttpClient client;
JSONObject db;

MongoLabHelper() throws ClientProtocolException, IOException, JSONException{
    client = new DefaultHttpClient();
    HttpGet request = new HttpGet("https://api.mongolab.com/api/1/databases/breadcrumbs/collections/crumbs?apiKey=xxxxxxxxxxxxx");
    HttpResponse response = client.execute(request);
    HttpEntity entity = response.getEntity();
    InputStream in = entity.getContent();
    String json = in.toString();
    db = new JSONObject(json); 
}

public String getName(String name) throws JSONException {
    JSONObject doc = db.getJSONObject(name);
    return doc.getString("name");               
}

这是它使用的类的一部分

   public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    String name = "Crumb Not Available";

    MongoLabHelper help;
    try {
        help = new MongoLabHelper();
        name = help.getName("Chipotle");
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }




    setContentView(R.layout.breadcrumb);
    TextView crumbName = (TextView) findViewById(R.id.crumb_name);
    crumbName.setText(name);

【问题讨论】:

    标签: android database json httpclient mlab


    【解决方案1】:

    您实际上需要显式设置 HttpClient 来处理 SSL。我相信这个 stackoverflow 线程有你需要的信息:

    Secure HTTP Post in Android

    为方便起见,我将从线程中复制相关的代码:

    private HttpClient createHttpClient()
    {
        HttpParams params = new BasicHttpParams();
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
        HttpProtocolParams.setUseExpectContinue(params, true);
    
        SchemeRegistry schReg = new SchemeRegistry();
        schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
        ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);
    
        return new DefaultHttpClient(conMgr, params);
    }
    

    【讨论】:

      【解决方案2】:

      作为助手;
      我还实现了 Android 库来抽象 MongoLab 通信。
      主要目标是创建一个易于使用的库,该库可直接从 Android 应用程序中利用云中 Mongo 的强大功能!
      注意:我还包含了使用 MongoLab 的自定义 ACRA 报告器。

      这是第一个版本(我会继续扩展)
      ->https://github.com/wareninja/mongolab-sdk

      【讨论】:

        【解决方案3】:

        这里有一个来自应用程序 http://lolapriego.com/blog/?p=16 的示例

        或者您可以查看此 Gist,您可以在其中了解如何在 Android 中发出 http 请求

        public class CustomHttpClient {
        /** The time it takes for our client to timeout */
        public static final int HTTP_TIMEOUT = 30 * 1000; // milliseconds
        
        /** Single instance of our HttpClient */
        private static HttpClient mHttpClient;
        
        /**
         * Get our single instance of our HttpClient object.
         *
         * @return an HttpClient object with connection parameters set
         */
        private static HttpClient getHttpClient() {
            if (mHttpClient == null) {
                mHttpClient = new DefaultHttpClient();
                final HttpParams params = mHttpClient.getParams();
                HttpConnectionParams.setConnectionTimeout(params, HTTP_TIMEOUT);
                HttpConnectionParams.setSoTimeout(params, HTTP_TIMEOUT);
                ConnManagerParams.setTimeout(params, HTTP_TIMEOUT);
            }
            return mHttpClient;
        }
        
        /**
         * Performs an HTTP Post request to the specified url with the
         * specified parameters.
         *
         * @param url The web address to post the request to
         * @param postParameters The parameters to send via the request
         * @return The result of the request
         * @throws Exception
         */
        public static String executeHttpPost(String url, JSONObject json) throws Exception {
            BufferedReader in = null;
            try {
                HttpClient client = getHttpClient();
                HttpPost request = new HttpPost(url);
                request.setEntity(new ByteArrayEntity(json.toString().getBytes("UTF-8")));
                request.setHeader( "Content-Type", "application/json");
        
                HttpResponse response = client.execute(request);
                in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        
                StringBuffer sb = new StringBuffer("");
                String line = "";
                String NL = System.getProperty("line.separator");
                while ((line = in.readLine()) != null) {
                    sb.append(line + NL);
                }
                in.close();
        
                String result = sb.toString();
                return result;
            } finally {
                if (in != null) {
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        
        /**
         * Performs an HTTP GET request to the specified url.
         *
         * @param url The web address to post the request to
         * @return The result of the request
         * @throws Exception
         */
        public static String executeHttpGet(String url) throws Exception {
            BufferedReader in = null;
            String data = null;
        
            try {
                HttpClient client = getHttpClient();
                HttpGet request = new HttpGet();
                request.setURI(new URI(url));
                HttpResponse response = client.execute(request);
                response.getStatusLine().getStatusCode();
        
                in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                StringBuffer sb = new StringBuffer("");
                String l = "";
                String nl = System.getProperty("line.separator");
                while ((l = in.readLine()) !=null){
                    sb.append(l + nl);
                }
                in.close();
                data = sb.toString();
                return data;        
            } finally{
                if (in != null){
                    try{
                        in.close();
                        return data;
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }
        }
        
        /**
         * Performs an HTTP DELETE request to the specified url.
         *
         * @param url The web address to post the request to
         * @return The result of the request
         * @throws Exception
         */
        public static String executeHttpDelete(String url) throws Exception {
            BufferedReader in = null;
            String data = null;
        
            try {
                HttpClient client = getHttpClient();
                HttpDelete request = new HttpDelete();
                request.setURI(new URI(url));
                HttpResponse response = client.execute(request);
                response.getStatusLine().getStatusCode();
        
                in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                StringBuffer sb = new StringBuffer("");
                String l = "";
                String nl = System.getProperty("line.separator");
                while ((l = in.readLine()) !=null){
                    sb.append(l + nl);
                }
                in.close();
                data = sb.toString();
                return data;        
            } finally{
                if (in != null){
                    try{
                        in.close();
                        return data;
                    }catch (Exception e){
                        e.printStackTrace();
                    }
                }
            }
        }
        
        /**
         * Performs an HTTP Put request to the specified url with the
         * specified parameters.
         *
         * @param url The web address to post the request to
         * @param putParameters The parameters to send via the request
         * @return The result of the request
         * @throws Exception
         */
        public static String executeHttpPut(String url, JSONObject json) throws Exception {
            BufferedReader in = null;
            try {
                HttpClient client = getHttpClient();
                HttpPut request = new HttpPut(url);
        
                request.setEntity(new ByteArrayEntity(json.toString().getBytes("UTF-8")));
                request.setHeader( "Content-Type", "application/json");
                HttpResponse response = client.execute(request);
                in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        
                StringBuffer sb = new StringBuffer("");
                String line = "";
                String NL = System.getProperty("line.separator");
                while ((line = in.readLine()) != null) {
                    sb.append(line + NL);
                }
                in.close();
        
                String result = sb.toString();
                return result;
            } finally {
                if (in != null) {
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        

        }

        【讨论】:

          猜你喜欢
          • 2021-09-27
          • 2020-11-24
          • 2012-10-29
          • 2011-06-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多