使用REST接口连接到数据库:无法连接

时间:2012-01-10 23:04:00

标签: android database json httpclient mlab

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

  

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):at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:185)01-10> 16:28:50.388:W / System.err(630) ):at 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);

3 个答案:

答案 0 :(得分:3)

您实际上需要显式设置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);
}

答案 1 :(得分:0)

作为帮助者;
我还实现了Android库来抽象MongoLab通信 主要目标是直接从Android应用程序中轻松使用可在云中利用Mongo强大功能的库! 注意:我还包括使用MongoLab的自定义ACRA记者。

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

答案 2 :(得分:0)

您在应用程序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();
            }
        }
    }
}

}