http_client cpprestsdk/casablanca

У меня есть API https://api.gm-system.net/api/authenticate/searchStaffs/searchText которые возвращают список сотрудников.

А вот мой код для доступа к этому API, используя cpprestsdk с с ++.

auto fileStream = std::make_shared<ostream>();

    // Open stream to output file.
    pplx::task<void> requestTask = fstream::open_ostream(U("results.html")).then([=](ostream outFile)
    {
        *fileStream = outFile;

        // Create http_client to send the request.
        http_client client(U("https://api.gm-system.net/api/authenticate/searchStaffs/michael"));


        return client.request(methods::GET);
    })

        // Handle response headers arriving.
        .then([=](http_response response)
    {
       ......
    }

Этот, если хорошо. Но с этим я просто вручную введите "michael" searchText,

Как я могу сделать так, чтобы он принимал любой searchText что-то вроде этого.

void MyTest(std::string searchText)
{
..... code here

// Create http_client to send the request.
http_client client(U("https://api.gm-system.net/api/authenticate/searchStaffs/" + searchText));

return client.request(methods::GET);

..... code here
}

Я уже пробовал это, это не будет работать. Некоторая проблема с макросом 'U'. С https://github.com/Microsoft/cpprestsdk/wiki/FAQ описание U macro это говорит:

The 'U' macro can be used to create a string literal of the platform type. If you are using a library causing conflicts with the 'U' macro, for example Boost.Iostreams it can be turned off by defining the macro '_TURN_OFF_PLATFORM_STRING' before including the C++ REST SDK header files.

Если я наведу курсор на U, ошибка говорит:

no operator "+" matches these operands operand types are; const wchar_t[57] + const std::string

Я надеюсь, что некоторые могут мне помочь. Благодарю.

1 ответ

Решение

Поскольку

В C++ REST SDK используется другой тип строки в зависимости от целевой платформы. Например, для платформ Windows утилита::string_t - это std:: wstring с использованием UTF-16, в Linux std::string с использованием UTF-8.

Вы должны использовать utility::string_t класс, когда это требуется, и не смешивайте его с std::string или же const char * (и использовать U макрос, когда нужно буквальное).

Другими словами, ваша функция должна принимать utility::string_t как его searchText аргумент (вместо std::string):

void MyTest(utility::string_t searchText)
{
    http_client client(U("https://api.gm-system.net/api/authenticate/searchStaffs/") + searchText);

    // etc ...

}

используйте это так:

int main()
{

    utility::string_t searchText = U("Michael");
    MyTest(searchText);

    return 0;
}

Если функция должна вызываться из контекста платформы, соответствующий std Тип может быть использован в качестве переданного в качестве аргумента типа (т.е. использовать std::wstring в Windows):

std::wstring searchText = L"Michael";
MyTest(searchText);
Другие вопросы по тегам