質問

私は開発しているAndroidアプリのMongolabs RESTインターフェイスを介してMongodbに接続しようとしていますが、接続しておらず、代わりに例外をスローしています(または、少なくともそうだと思います)。私はバックエンドに精通していないので、致命的なルーキーの間違いを犯しているなら、許してください。これがログキャットです

01-10 16:28:28:50.377:w/system.err(630):javax.net.ssl.sslexception:証明書のホスト名は一致しませんでした:!=または> 01-10 16:28:50.377:w/ System.err(630):atorg.apache.http.conn.ssl.abstractverifier.verify(abstractverifier.java:185)01-10> 16:28:50.388:w/system.err(630):atorg。 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);
役に立ちましたか?

解決

実際、SSLを処理するためにHTTPCLIENTを明示的にセットアップする必要があります。このStackoverFlowスレッドには必要な情報があると思います。

AndroidでHTTP投稿を保護します

便利なために、スレッドから関連するコードをコピーします。

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);
}

他のヒント

ヘルパーとして;
また、モンゴラブ通信を抽象化するためにAndroidライブラリを実装しました。
主な目標は、Androidアプリケーションから直接、クラウド内のMongoのパワーを活用するライブラリを簡単に使用できるようにすることです。
注:Mongolabを使用するカスタムACRAレポーターも含めました。

これが最初のバージョンです (延長を続けます):
-> https://github.com/wareninja/mongolab-sdk

アプリケーションの例はここにあります http://lolapriego.com/blog/?p=16

または、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();
            }
        }
    }
}

}

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top