Java IBM云存储客户端

Java IBM云存储客户端,java,sdk,ibm-cloud,Java,Sdk,Ibm Cloud,我正在尝试使用IBM的云存储来上传/下载数据——我使用免费层,IBM似乎有最好的选择。从图中可以看出,我为我的客户端创建了凭据(由于明显的原因,没有显示JSON文件): 我还创建了一个bucket: 该bucket具有链接到具有读/写(角色编写器)访问权限的bucket的服务凭据,如下所示: 然后,我使用JSON文件中的凭据(apikey、端点和资源_实例_id)来创建客户机: { "apikey": "XXXX", "endpoints": "https://control.cl

我正在尝试使用IBM的云存储来上传/下载数据——我使用免费层,IBM似乎有最好的选择。从图中可以看出,我为我的客户端创建了凭据(由于明显的原因,没有显示JSON文件):

我还创建了一个bucket:

该bucket具有链接到具有读/写(角色编写器)访问权限的bucket的服务凭据,如下所示:

然后,我使用JSON文件中的凭据(apikey、端点和资源_实例_id)来创建客户机:

{
  "apikey": "XXXX",
  "endpoints": "https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints",
  "iam_apikey_description": "Auto-generated for key XXXX",
  "iam_apikey_name": "client-test",
  "iam_role_crn": "crn:v1:bluemix:public:iam::::serviceRole:Manager",
  "iam_serviceid_crn": "XXXX",
  "resource_instance_id": "XXXX::"
}
IBM有自己的Java sdk,所以我添加了maven依赖项(IBMCosJavaSDK版本2.5.4)。我按照他们的示例创建了一个单独的类IbmCloudClient。我看到的唯一区别是,我没有选择位置,因为我创建了一个只存在于一个位置的bucket。因此,我将
null
转发为位置值。客户端代码如下所示:

package xyz.blackmonster.cloud;

import com.ibm.cloud.objectstorage.ClientConfiguration;
import com.ibm.cloud.objectstorage.auth.AWSCredentials;
import com.ibm.cloud.objectstorage.auth.AWSStaticCredentialsProvider;
import com.ibm.cloud.objectstorage.client.builder.AwsClientBuilder;
import com.ibm.cloud.objectstorage.oauth.BasicIBMOAuthCredentials;
import com.ibm.cloud.objectstorage.services.s3.AmazonS3;
import com.ibm.cloud.objectstorage.services.s3.AmazonS3ClientBuilder;
import com.ibm.cloud.objectstorage.services.s3.model.ListObjectsRequest;
import com.ibm.cloud.objectstorage.services.s3.model.ObjectListing;
import com.ibm.cloud.objectstorage.services.s3.model.S3ObjectSummary;

import java.util.List;
import java.util.stream.Collectors;

public class IbmCloudClient {

    private AmazonS3 cloudClient;

    public IbmCloudClient(String apiKey, String resourceInstanceID, String endpointUrl) {
        AWSCredentials credentials;
        credentials = new BasicIBMOAuthCredentials(apiKey, resourceInstanceID);
        ClientConfiguration clientConfig = new ClientConfiguration().withRequestTimeout(5000);
        clientConfig.setUseTcpKeepAlive(true);
        cloudClient =
                AmazonS3ClientBuilder
                    .standard()
                    .withCredentials(new AWSStaticCredentialsProvider(credentials))
                    .withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endpointUrl, null))
                    .withPathStyleAccessEnabled(true)
                    .withClientConfiguration(clientConfig).build();
    }

    public List<String> listObjects() {
        ObjectListing objectListing = cloudClient.listObjects(new ListObjectsRequest().withBucketName("resume-storage"));
        List<String> files = objectListing.getObjectSummaries().stream().map(S3ObjectSummary::getKey).collect(Collectors.toList());

        return files;
    }
}
我还尝试调用
cloudClient.listBuckets()
,在那里我还遇到了一个异常:

Exception in thread "main" com.ibm.cloud.objectstorage.SdkClientException: Failed to parse XML document with handler class com.ibm.cloud.objectstorage.services.s3.model.transform.XmlResponsesSaxParser$ListAllMyBucketsHandler
    at com.ibm.cloud.objectstorage.services.s3.model.transform.XmlResponsesSaxParser.parseXmlInputStream(XmlResponsesSaxParser.java:156)
    at com.ibm.cloud.objectstorage.services.s3.model.transform.XmlResponsesSaxParser.parseListMyBucketsResponse(XmlResponsesSaxParser.java:348)
    at com.ibm.cloud.objectstorage.services.s3.model.transform.Unmarshallers$ListBucketsUnmarshaller.unmarshall(Unmarshallers.java:38)
    at com.ibm.cloud.objectstorage.services.s3.model.transform.Unmarshallers$ListBucketsUnmarshaller.unmarshall(Unmarshallers.java:34)
    at com.ibm.cloud.objectstorage.services.s3.internal.S3XmlResponseHandler.handle(S3XmlResponseHandler.java:65)
    at com.ibm.cloud.objectstorage.services.s3.internal.S3XmlResponseHandler.handle(S3XmlResponseHandler.java:34)
    at com.ibm.cloud.objectstorage.http.response.AwsResponseHandlerAdapter.handle(AwsResponseHandlerAdapter.java:70)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.handleResponse(AmazonHttpClient.java:1627)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1336)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1113)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:770)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:744)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:726)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:686)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:668)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient.execute(AmazonHttpClient.java:532)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient.execute(AmazonHttpClient.java:512)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3921)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3868)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3862)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.listBuckets(AmazonS3Client.java:881)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.listBuckets(AmazonS3Client.java:887)
    at xyz.blackmonster.cloud.IbmCloudClient.listObjects(IbmCloudClient.java:37)
    at xyz.blackmonster.main.IbmCloudRunner.main(IbmCloudRunner.java:16)
Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1472)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:994)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:842)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
    at com.ibm.cloud.objectstorage.services.s3.model.transform.XmlResponsesSaxParser.parseXmlInputStream(XmlResponsesSaxParser.java:142)
    ... 23 more
Disconnected from the target VM, address: '127.0.0.1:53560', transport: 'socket'

你知道怎么了吗?是代码导致问题还是我没有正确设置存储桶?

您正在使用的
endpointUrl
是什么?我猜您正在声明路径样式并使用虚拟主机样式。路径样式:
https://{endpoint}/{bucket name}
我没有屏蔽上面的端点。我正在使用
“端点”:https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints“
据我所知,它确实像看上去那样连接。如果您查找代码,我会指定bucket名称(即resume storage)。客户机本身是初始化的,但一旦我发出请求,就会出现异常。调试问题的第一个基本步骤是不要假设任何东西。您的代码不显示如何调用
IbmCloudClient
。因此,我无法从您的问题中判断该函数是如何调用的,以及使用了哪些参数。您的错误“通常”意味着您使用了错误的端点。如果我知道答案,我会发布一个答案。相反,我提供了一个关于问题可能是什么的提示。编辑你的问题,这样我们就不必猜测了。我为此道歉,你是对的。我添加了main类,在这里我创建了客户机。我想指出,我手动设置了API键和资源实例ID(main函数有字符串)。我知道你有两个选择的凭据。一种是在特定路径上使用JSON文件,另一种是在创建客户机时手动设置正确的值。如你所见,我选择了第二个选项。希望这能给@johnhanley更多的了解您正在使用的
endpointUrl
是什么?我猜您正在声明路径样式并使用虚拟主机样式。路径样式:
https://{endpoint}/{bucket name}
我没有屏蔽上面的端点。我正在使用
“端点”:https://control.cloud-object-storage.cloud.ibm.com/v2/endpoints“
据我所知,它确实像看上去那样连接。如果您查找代码,我会指定bucket名称(即resume storage)。客户机本身是初始化的,但一旦我发出请求,就会出现异常。调试问题的第一个基本步骤是不要假设任何东西。您的代码不显示如何调用
IbmCloudClient
。因此,我无法从您的问题中判断该函数是如何调用的,以及使用了哪些参数。您的错误“通常”意味着您使用了错误的端点。如果我知道答案,我会发布一个答案。相反,我提供了一个关于问题可能是什么的提示。编辑你的问题,这样我们就不必猜测了。我为此道歉,你是对的。我添加了main类,在这里我创建了客户机。我想指出,我手动设置了API键和资源实例ID(main函数有字符串)。我知道你有两个选择的凭据。一种是在特定路径上使用JSON文件,另一种是在创建客户机时手动设置正确的值。如你所见,我选择了第二个选项。希望这能给JohnHanley带来更多的洞察力
Exception in thread "main" com.ibm.cloud.objectstorage.services.s3.model.AmazonS3Exception: Not Found (Service: Amazon S3; Status Code: 404; Error Code: 404 Not Found; Request ID: null), S3 Extended Request ID: null
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1712)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1367)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1113)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:770)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:744)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:726)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:686)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:668)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient.execute(AmazonHttpClient.java:532)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient.execute(AmazonHttpClient.java:512)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3921)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3868)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3862)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.listObjects(AmazonS3Client.java:779)
    at xyz.blackmonster.cloud.IbmCloudClient.listObjects(IbmCloudClient.java:36)
    at xyz.blackmonster.main.IbmCloudRunner.main(IbmCloudRunner.java:16)
Exception in thread "main" com.ibm.cloud.objectstorage.SdkClientException: Failed to parse XML document with handler class com.ibm.cloud.objectstorage.services.s3.model.transform.XmlResponsesSaxParser$ListAllMyBucketsHandler
    at com.ibm.cloud.objectstorage.services.s3.model.transform.XmlResponsesSaxParser.parseXmlInputStream(XmlResponsesSaxParser.java:156)
    at com.ibm.cloud.objectstorage.services.s3.model.transform.XmlResponsesSaxParser.parseListMyBucketsResponse(XmlResponsesSaxParser.java:348)
    at com.ibm.cloud.objectstorage.services.s3.model.transform.Unmarshallers$ListBucketsUnmarshaller.unmarshall(Unmarshallers.java:38)
    at com.ibm.cloud.objectstorage.services.s3.model.transform.Unmarshallers$ListBucketsUnmarshaller.unmarshall(Unmarshallers.java:34)
    at com.ibm.cloud.objectstorage.services.s3.internal.S3XmlResponseHandler.handle(S3XmlResponseHandler.java:65)
    at com.ibm.cloud.objectstorage.services.s3.internal.S3XmlResponseHandler.handle(S3XmlResponseHandler.java:34)
    at com.ibm.cloud.objectstorage.http.response.AwsResponseHandlerAdapter.handle(AwsResponseHandlerAdapter.java:70)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.handleResponse(AmazonHttpClient.java:1627)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1336)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1113)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:770)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:744)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:726)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:686)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:668)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient.execute(AmazonHttpClient.java:532)
    at com.ibm.cloud.objectstorage.http.AmazonHttpClient.execute(AmazonHttpClient.java:512)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3921)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3868)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3862)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.listBuckets(AmazonS3Client.java:881)
    at com.ibm.cloud.objectstorage.services.s3.AmazonS3Client.listBuckets(AmazonS3Client.java:887)
    at xyz.blackmonster.cloud.IbmCloudClient.listObjects(IbmCloudClient.java:37)
    at xyz.blackmonster.main.IbmCloudRunner.main(IbmCloudRunner.java:16)
Caused by: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Content is not allowed in prolog.
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
    at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
    at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
    at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1472)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:994)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:842)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
    at com.ibm.cloud.objectstorage.services.s3.model.transform.XmlResponsesSaxParser.parseXmlInputStream(XmlResponsesSaxParser.java:142)
    ... 23 more
Disconnected from the target VM, address: '127.0.0.1:53560', transport: 'socket'