Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用带有用户名和密码的couchdb4j api连接到couchdb数据库?_Couchdb - Fatal编程技术网

如何使用带有用户名和密码的couchdb4j api连接到couchdb数据库?

如何使用带有用户名和密码的couchdb4j api连接到couchdb数据库?,couchdb,Couchdb,我使用couchdb4j api通过会话对象与couchdb(版本0.11.2)建立连接。 Couchdb数据库受用户名和密码保护, 试图与建立联系 会话(字符串主机、int端口、字符串用户、字符串传递、布尔usesAuth、布尔安全)构造函数,通过提供主机、端口、用户、传递和用户sauth true、secure false、, 但它无法与用户名和密码建立连接,并发出警告身份验证错误:无法响应以下任何挑战:{}。 我使用了正确的用户名和密码。尝试一个主动维护的CouchDB库。我通过编写一个简

我使用couchdb4j api通过会话对象与couchdb(版本0.11.2)建立连接。 Couchdb数据库受用户名和密码保护, 试图与建立联系 会话(字符串主机、int端口、字符串用户、字符串传递、布尔usesAuth、布尔安全)构造函数,通过提供主机、端口、用户、传递和用户sauth true、secure false、, 但它无法与用户名和密码建立连接,并发出警告身份验证错误:无法响应以下任何挑战:{}。
我使用了正确的用户名和密码。

尝试一个主动维护的CouchDB库。

我通过编写一个简单的Curl类来解决同样的问题,该类简化了通信并以字符串形式返回JSON,因为这就是返回的内容

它应该是不言自明的,您可以阅读主方法以获得提示

package path.to.the.class;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.codec.binary.Base64;

import Log;

/**
 * This class takes on the simple task of doing http calls to any http web service like a web page or alike. Since the
 * class is streamlined for JSON use this is the most easiest to set up.
 * 
 * @author mikael.p.larsson@epsilon.nu
 * 
 */
public class Curl {
    private Map<String, String> requestProperties = null;
    private String charsetName = "UTF8";

    public static final String GET = "GET";
    public static final String PUT = "PUT";
    public static final String POST = "POST";
    public static final String HEAD = "HEAD";
    public static final String DELETE = "DELETE";

    /**
     * This is the default constructor for Curl which takes it for granted that you want to communicate and read JSON.
     * Most of the times this approach works even if plain html or text is requested.
     */
    public Curl() {
        requestProperties = new HashMap<String, String>();
        requestProperties.put("Content-Type", "application/json");
    }

    /**
     * With this alternate constructor a map containing header strings can be provided, useful if something apart from
     * JSON is to be consumed.
     * 
     * @param requestProperties
     *            a Map containing the header strings.
     */
    public Curl(Map<String, String> requestProperties) {
        this.requestProperties = requestProperties;
    }

    /**
     * Public setter to enable setting charsetName.
     * 
     * @param charsetName
     * @return this instance to enable on liners.
     */
    public Curl setCharsetName(String charsetName) {
        this.charsetName = charsetName;
        return this;
    }

    /**
     * In the world of the web this is the command that a web browser does for you after you have entered an url into
     * the address field. When using GET there should be no side effects on the site the data was requested from; the
     * get method only consumes data and sends nothing.
     * 
     * @param urlAsString
     *            the url to fetch from the internet.
     * @return The response from the server
     */
    public String get(String urlAsString) {
        return doHttpCall(urlAsString, GET, null);
    }

    /**
     * Put should be used when a resource should be sent to a server.
     * 
     * @param urlAsString
     *            the url to the resource.
     * @param doc
     *            the content to put
     * @return The response from the server.
     */
    public String put(String urlAsString, String doc) {
        return doHttpCall(urlAsString, "PUT", doc);
    }

    /**
     * Post should be used when a resource should be posted to a server.
     * 
     * @param urlAsString
     *            the url to the resource.
     * @param doc
     *            the content to put
     * @return The response from the server.
     */
    public String post(String urlAsString, String doc) {
        return doHttpCall(urlAsString, "POST", doc);
    }

    /**
     * Mostly to be considered as a get without the contents, Here implemented as an is the resource available function.
     * 
     * @param urlAsString
     *            the url to the resource.
     * @return The responseMessage from the server.
     */
    public String head(String urlAsString) {
        return doHttpCall(urlAsString, "HEAD", null);
    }

    /**
     * Deletes a resource from an url. Be careful!
     * 
     * @param urlAsString
     *            The url to the resource to delete.
     * @return The response from the server.
     */
    public String delete(String urlAsString) {
        try {
            return doHttpCall(urlAsString, "DELETE", null);
        } catch (Exception e) {
            Log.warn("No object to delete found at " + urlAsString + ".");
            return "No object to delete found at " + urlAsString + ".";
        }
    }

    /**
     * This method does the actual HTTP communication to simplify the methods above.
     * 
     * @param urlAsString
     *            The url to resource in question.
     * @param method
     *            The method to be used.
     * @param doc
     *            The resource to send or null if none.
     * @return The response from the server.
     */
    private String doHttpCall(String urlAsString, String method, String doc) {
        StringBuffer result = new StringBuffer();
        HttpURLConnection httpUrlConnection = null;

        try {
            URL url = new URL(urlAsString);
            httpUrlConnection = (HttpURLConnection) url.openConnection();
            httpUrlConnection.setDoInput(true);
            httpUrlConnection.setRequestMethod(method);

            if (url.getUserInfo() != null) {
                String basicAuth = "Basic " + new String(new Base64().encode(url.getUserInfo().getBytes()));
                httpUrlConnection.setRequestProperty("Authorization", basicAuth);
            }
            httpUrlConnection.setRequestProperty("Content-Length", "0");
            for (String key : requestProperties.keySet()) {
                httpUrlConnection.setRequestProperty(key, requestProperties.get(key));
            }

            if (doc != null && !doc.isEmpty()) {
                httpUrlConnection.setDoOutput(true);
                httpUrlConnection.setRequestProperty("Content-Length", "" + doc.getBytes(charsetName));

                OutputStreamWriter outputStreamWriter = new OutputStreamWriter(httpUrlConnection.getOutputStream(),
                        charsetName);
                outputStreamWriter.write(doc);
                outputStreamWriter.close();

            }

            readInputStream(result, httpUrlConnection.getInputStream());

        } catch (RuntimeException e) {
            Log.info(e.getMessage());
        } catch (MalformedURLException e) {
            Log.warn("The url '" + urlAsString + "' is malformed.");
        } catch (IOException e) {
            try {
                result.append(e.getMessage());
                readInputStream(result, httpUrlConnection.getErrorStream());
                if ("".equals(result.toString())) {
                    result.append("Error ");
                    result.append(httpUrlConnection.getResponseCode());
                    result.append(" : ");
                    result.append(httpUrlConnection.getResponseMessage());
                    result.append(".  Exception message is: [");
                    result.append(e.getMessage());
                    result.append("]");
                }
            } catch (IOException e1) {
            }
        } finally {
            if ("HEAD".equalsIgnoreCase(method)) {
                try {
                    result.append(httpUrlConnection.getResponseMessage());
                } catch (IOException e) {
                    Log.fatal("This is as low as we can get, nothing worked!");
                    e.printStackTrace();
                }
            }
            if (httpUrlConnection != null)
                httpUrlConnection.disconnect();
        }
        return result.toString();
    }

    /**
     * Local helper method that reads data from an inputstream.
     * 
     * @param result
     *            The read text.
     * @param inputStream
     *            The stream to read.
     * @throws UnsupportedEncodingException
     * @throws IOException
     */
    private void readInputStream(StringBuffer result, InputStream inputStream) throws UnsupportedEncodingException,
            IOException {
        if (inputStream == null)
            throw new IOException("No working inputStream.");
        InputStreamReader streamReader = new InputStreamReader(inputStream, charsetName);
        BufferedReader bufferedReader = new BufferedReader(streamReader);

        String row;
        while ((row = bufferedReader.readLine()) != null) {
            result.append(row);
            result.append("\n");
        }

        bufferedReader.close();
        streamReader.close();
    }

    /**
     * A main method to provide the possibility to use this exact class from the command line.
     * <p>
     * usage:
     * <code>java -cp target/classes/. path.to.the.class.Curl http://server.domain.nu:port/path/to/resource method [data]</code>
     * </p>
     * 
     * @param args
     *            in order: url method data
     */
    public static void main(String[] args) {
        if (args.length < 2) {
            System.out.println("usage: Curl path method [data]");
            System.exit(0);
        }
        String url = args[0];
        String method = args[1];
        String data = args.length == 3 ? args[2] : null;
        Curl curl = new Curl();

        if (method.equals("head")) {
            System.out.println(curl.head(url));
            System.exit(0);
        }
        if (method.equals("put")) {
            System.out.println(curl.put(url, data));
            System.exit(0);
        }

        System.out.println(curl.doHttpCall(url, method, data));
    }

}

尝试将配置参数required\u valid\u user更改为true

您是否可以直接访问数据库,例如使用curl?类似于curl http://:@localhost:5984/_会话的结果是什么?使用curl进行测试非常复杂,因为有些密码字符对shell无效,而另一些密码字符对curl无效。既然卷发很容易,我同意先试试。如果失败,请尝试使用Futon从浏览器登录。至少这将确认基础、名称查找、网络和身份验证。@Colin Ross,是的,我可以从curl访问它,下面是对http://:@localhost:5984/_会话{“ok”:true,“userCtx”:{“name”:“admin”,“roles”:[“_admin”]},“info”:{“authentication_db”:“_用户”,“authentication_处理程序”:[“”],“authenticated”:“}有趣的是,当我做同样的事情时,我有一个身份验证处理程序数组,包括“oauth”、“cookie”和“default”。此外,我的“authenticated”字段的值为“default”。可能您已禁用/未启用相应的处理程序?你能用Futon登录吗?@Colin Ross,我启用了处理程序并设置require_valid_user=true,然后我在/_会话的响应中得到了处理程序,{“ok”:true,“userCtx”:{“name”:“admin”,“roles”:[“_admin”]},“info”:{“authentication_db”:“_users”,“authentication_处理程序”:[“oauth”,“cookie”,“default”],“authenticated”:“default”}。但在访问数据库时出现相同的身份验证错误