2016-11-07 4 views
1

Мне нужно сделать подписанные запросы AWS ES, но я застрял в первом препятствии, так как я не могу использовать CurlHttpClient. Вот мой код (verb, path и body определены в другом месте):aws-sdk-cpp: как использовать CurlHttpClient?

Aws::Client::ClientConfiguration clientConfiguration; 
clientConfiguration.scheme = Aws::Http::Scheme::HTTPS; 
clientConfiguration.region = Aws::Region::US_EAST_1; 

auto client = Aws::MakeShared<Aws::Http::CurlHttpClient>(ALLOCATION_TAG, clientConfiguration); 

Aws::Http::URI uri;  
uri.SetScheme(Aws::Http::Scheme::HTTPS);  
uri.SetAuthority(ELASTIC_SEARCH_DOMAIN);  
uri.SetPath(path); 

Aws::Http::Standard::StandardHttpRequest req(uri, verb); 
req.AddContentBody(body); 

auto res = client->MakeRequest(req); 

Aws::Http::HttpResponseCode resCode = res->GetResponseCode();  
if (resCode == Aws::Http::HttpResponseCode::OK) { 
    Aws::IOStream &body = res->GetResponseBody(); 
    rejoiceAndBeMerry(); 
} 
else { 
    gotoPanicStations(); 
} 

При выполнении кода бросает bad_function_call глубоко внутри SDK вперемешку с большим количеством shared_ptr этого и выделить это. Я предполагаю, что я просто использую SDK неправильно, но я не смог найти примеры, которые используют CurlHttpClient напрямую, например, мне нужно сделать здесь.

Как я могу использовать CurlHttpClient?

ответ

1

Вы не должны использовать HTTP-клиент напрямую, а поставляемые обертки с пакетом aws-cpp-sdk-es. Как и предыдущие ответы, я бы рекомендовал оценить тестовые примеры, поставляемые с библиотекой, чтобы увидеть, как оригинальные авторы намеревались реализовать API (по крайней мере, до тех пор, пока не будут догоняющие документы).

Как можно использовать CurlHttpClient?

Ваш правильный путь с управляемыми совместно используемыми ресурсами и вспомогательными функциями. Просто нужно создать статический завод/клиент для ссылки. Вот общий пример.

using namespace Aws::Client; 
using namespace Aws::Http; 

static std::shared_ptr<HttpClientFactory> MyClientFactory; // My not be needed 
static std::shared_ptr<HttpClient> MyHttpClient; 

// ... jump ahead to method body ... 

ClientConfiguration clientConfiguration; 
MyHttpClient = CreateHttpClient(clientConfiguration); 
Aws::String uri("https://example.org"); 
std::shared_ptr<HttpRequest> req(
       CreateHttpRequest(uri, 
           verb, // i.e. HttpMethod::HTTP_POST 
           Utils::Stream::DefaultResponseStreamFactoryMethod)); 
req.AddContentBody(body); //<= remember `body' should be `std::shared_ptr<Aws::IOStream>', 
          // and can be created with `Aws::MakeShared<Aws::StringStream>("")'; 
req.SetContentLength(body_size); 
req.SetContentType(body_content_type); 
std::shared_ptr<HttpResponse> res = MyHttpClient->MakeRequest(*req); 
HttpResponseCode resCode = res->GetResponseCode();  
if (resCode == HttpResponseCode::OK) { 
    Aws::StringStream resBody; 
    resBody << res->GetResponseBody().rdbuf(); 
    rejoiceAndBeMerry(); 
} else { 
    gotoPanicStations(); 
} 
1

Я столкнулся с такой же ошибкой при попытке загрузить с S3 с помощью CurlHttpClient.

Я установил его вместо моделирования моего кода после интеграции найденных в CPP SDK:

aws-sdk-cpp/aws-cpp-sdk-s3-integration-tests/BucketAndObjectOperationTest.cpp 

Поиска теста называется TestObjectOperationsWithPresignedUrls.