Как отправить запрос на получение и публикацию с помощью библиотеки POCO и OAuth2 - PullRequest
0 голосов
/ 07 мая 2018

У меня есть собственная прикладная программа для окон, и я хочу получить доступ к API службы gitlab, надеюсь получить токен, используя имя и пароль, используя POCO Library и OAuth2, но я не знаю, как отправить запрос Get и Post на gitlab с помощью OAuth2, и используя библиотеку POCO, приведите пример.

Вот данные, которые нужно отправить и получить.

Запрос токена доступа POST-запрос к / oauth / token с параметрами:

{
  "grant_type"    : "password",
  "username"      : "user@example.com",
  "password"      : "secret"
}

Затем вы получите токен доступа в ответе:

{
  "access_token": "1f0af717251950dbd4d73154fdf0a474a5c5119adad999683f5b450c460726aa",
  "token_type": "bearer",
  "expires_in": 7200
}

1 Ответ

0 голосов
/ 29 августа 2018

Сначала вам нужно создать объект HTTPRequest, например:

Poco::Net::HTTPClientSession* session = Poco::Net::HTTPSessionFactory::defaultFactory().createClientSession(serverUri);
Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_POST, serverUri.getPathAndQuery(), Poco::Net::HTTPMessage::HTTP_1_1); 

Затем создайте HTMLForm:

Poco::Net::HTMLForm form; 
form.add("grant_type", "password");
form.add("client_id", "client token");
form.add("client_secret", "client secret");
form.add("username", "user@example.com");
form.add("password", "secret");
form.prepareSubmit(request); 

Отправьте запрос и запишите данные формы в выходной поток запроса:

std::ostream& requestStream = session->sendRequest(request);
form.write(requestStream);

Получить ответ из сеанса:

Poco::Net::HTTPResponse response;
std::istream& responseStream = session->receiveResponse(response);
std::stringstream rawJson;
Poco::StreamCopier::copyStream(responseStream, rawJson);

Разобрать необработанный JSON:

 Poco::JSON::Parser parser;
 Poco::JSON::Object::Ptr authObj =  parser.parse(rawJson).extract<Poco::JSON::Object::Ptr>();

Создайте новый сеанс для следующего запроса и присоедините к запросу заголовок авторизации:

Poco::Net::HTTPClientSession* dataSession = Poco::Net::HTTPSessionFactory::defaultFactory().createClientSession(dataUri);
Poco::Net::HTTPRequest dataRequest(Poco::Net::HTTPRequest::HTTP_GET, dataUri.getPathAndQuery(), Poco::Net::HTTPMessage::HTTP_1_1);
dataRequest.add("Authorization", "Bearer " + authObj->get("access_token"));
dataSession->sendRequest(dataRequest);

Получить ответ и прочитать данные из потока:

std::stringstream data;
Poco::Net::HTTPResponse dataResponse;
Poco::StreamCopier::copyStream(dataSession->receiveResponse(dataResponse), data);

Надеюсь, это поможет или указывает в правильном направлении.

...