2

我在使用具有读取权限(或所有权限)的密钥/通行证从 Cloudant.com 获取信息时遇到问题。我以任何方式设置此用户都收到 500 错误。但是,目前一切正常,但我让自己对黑客开放,因为我必须打开我的数据库以供所有人阅读。我们都知道这可能是个问题。我想知道是否有人对为什么会发生这个问题有任何见解。顺便说一句,我已经在 Android 和 iOS 应用程序中尝试过。当前的问题是使用 Android 应用程序中的示例。

这是我单身乌托邦的标准:

private static String _remote_db_protocal = "https";
private static String _remote_db_key = "mykey";
private static String _remote_db_pass = "mypass";
private static String _remote_db_account = "myaccount";
private static String _remote_db_dbname = "mydbname";

public static String REMOTE_JSON_DB_URL = _remote_db_protocal+"://"+
        _remote_db_key+":"+_remote_db_pass+"@"+
        _remote_db_account+".cloudant.com/"+_remote_db_dbname;

这是我发送以获取 URL 字符串响应的信息:

    private static String dbBaseURL = Utopia.REMOTE_JSON_DB_URL;
    .... 
    String dbQueryURL = "/_design/app/_view/toys";
    URL finalURL;
    try {

        finalURL = new URL(dbBaseURL + dbQueryURL);
        Log.i(TAG, "Getting URL: "+finalURL.toString());

        response = WebStuff.getURLStringResponse(finalURL);
   ....

最后,这是我的 getURLStringResponse() 函数:

/*
 *  Get information back from a URL
 */
public static String getURLStringResponse(URL url)
{
    String response = "";

    try {
        URLConnection conn = url.openConnection();
        BufferedInputStream bin = new BufferedInputStream(conn.getInputStream());

        byte[] contentBytes = new byte[1024];
        int bytesRead = 0;
        StringBuffer responseBuffer = new StringBuffer();

        while ((bytesRead = bin.read(contentBytes)) != -1)
        {
            response = new String(contentBytes, 0, bytesRead);
            responseBuffer.append(response);
        }

        return responseBuffer.toString();

    } catch (Exception e) {
        // TODO: handle exception
        Log.e(TAG, "getURLStringResponse Error as Follows");
        Log.e(TAG, e.toString());
    }

    return response;
}

所以有了以上所有,我希望有人能回答这个问题。我还必须注意,我将从在日志中某处吐出的查询中获取我的确切 URL,或者只是从 REMOTE_JSON_DB_URL 变量和我正在寻找的值重新创建它,然后将其传递到浏览器中,一切正常(是的,正在注销我的帐户)。

编辑:更正,当我将其粘贴到浏览器中时,它会询问我的登录凭据并使用密钥/密码使其工作。Cloudant 开发人员要求我向 StackOverflow 提出这个问题,因为他们不确定发生了什么(他们还让我的整个应用程序带有密钥/通行证凭据等等)。

4

2 回答 2

3

好吧,我似乎已经想通了。昨天得到威尔的回答后,我走了几条不同的路,但可惜他们中的大多数甚至没有让我接近。其中一些将错误代码从 500 更改为 401,但这些也改变了 BufferedInputStream 的预期用途。无论如何,如果您想使用带有 URLConnection 的 BufferedInputStream,并包括对 Cloudant 或其他任何情况的身份验证,您需要使用 setRequestProperty。现在,话虽如此,我用几种不同的方式尝试了这条路线,并在建立连接并将 url 传递给函数后添加用户和密码并执行 base64 切换根本不起作用。因此,如果您能够像我最初拥有的那样使用 URL 传递密钥/传递,那么以下内容将非常适合您...

        if (url.getUserInfo() != null) {
            String basicAuth = "Basic " + new String(Base64.encode(url.getUserInfo().getBytes(), 0));
            conn.setRequestProperty("Authorization", basicAuth);
        }

当然,这里是在我的函数中实现的,所以你可以得到完整的效果。

public static String getURLStringResponse(URL url)
{
    String response = "";

    try {
        URLConnection conn = url.openConnection();

        // THIS WAS THE MAGIC ENTRY
        if (url.getUserInfo() != null) {
            String basicAuth = "Basic " + new String(Base64.encode(url.getUserInfo().getBytes(), 0));
            conn.setRequestProperty("Authorization", basicAuth);
        }
        // END OF MAGIC CHANGE

        BufferedInputStream bin = new BufferedInputStream(conn.getInputStream());

        byte[] contentBytes = new byte[1024];
        int bytesRead = 0;
        StringBuffer responseBuffer = new StringBuffer();

        while ((bytesRead = bin.read(contentBytes)) != -1)
        {
            response = new String(contentBytes, 0, bytesRead);
            responseBuffer.append(response);
        }

        return responseBuffer.toString();

    } catch (Exception e) {
        // TODO: handle exception
        Log.e(TAG, "getURLStringResponse Error as Follows");
        Log.e(TAG, e.toString());
    }

    return response;
}

我真的希望这对你们中的一些人有所帮助。

于 2013-08-29T04:30:21.150 回答
0

我的第一个想法是您可能没有在请求中正确发送凭据。

https://<username>:<password>@username.cloudant.comURL 语法要求您使用 HTTP 库,该库将解析该 URL 并为请求生成适当的基本身份验证标头。鉴于您使用的是低级库,我猜您需要手动设置它。

您可能想要使用 URLhttps://username.cloudant.com并设置身份验证标头,如Connecting to remote URL which requires authentication using Java中所述。

于 2013-08-27T09:40:19.320 回答