Vala에서 CURL을 사용하는 방법
Whaler 앱에서 작업하는 동안 이러한 정보 부족에 직면했습니다. 앱은 Docker 엔진 API 메서드를 호출하여 내부적으로 Docker 컨테이너를 관리합니다.
프로젝트를 시작할 때 HTTP 요청을 하려면 어떤 라이브러리를 사용해야 합니까?라는 질문에 직면했습니다. 중요한 요구 사항이 있었습니다. 라이브러리는 UNIX 소켓을 지원해야 했습니다.
세 가지 옵션이 있습니다.
GLib.Socket은 HTTP 프로토콜과 함께 작동하기 위해 래퍼를 구현해야 했습니다. Libsoup-2.4는 UNIX 소켓을 지원하지 않았습니다(3.0 버전부터 사용할 수 있게 되었습니다). 이것이 제가 처음 두 개를 건너뛰고 libcurl을 선택한 이유입니다. Vala 바인딩과 지원되는 UNIX 소켓이 있습니다.
프로젝트에 libcurl을 추가하는 방법
먼저 시스템에 libcurl이 설치되어 있는지 확인하십시오. 그렇지 않은 경우 반드시 설치하십시오.
작은 데모 프로젝트를 살펴보겠습니다.
폴더 구조:
project/
meson.build
app.vala
vapi/
libcurl.vapi
libcurl.deps
List of Vala Bindings에서 libcurl.vapi 및 libcurl.deps를 다운로드할 수 있습니다.
meson.build:
project('com.github.sdv43.vala-recipes.curl', 'vala', 'c', version: '1.0.0')
vapi_dir = meson.current_source_dir() / 'vapi'
add_project_arguments(['--vapidir', vapi_dir], language: 'vala')
executable(
meson.project_name(),
'app.vala',
dependencies: [
dependency('glib-2.0'),
meson.get_compiler('vala').find_library('posix'),
meson.get_compiler('vala').find_library('libcurl', dirs: vapi_dir),
meson.get_compiler('c').find_library('libcurl'),
],
)
이제 app.vala에서 CURL을 사용할 수 있습니다.
void main() {
var curl = new Curl.EasyHandle();
// set curl options
var code = curl.perform();
assert_true(code == Curl.Code.OK);
}
쉬운 인터페이스 vs. 멀티 인터페이스
CURL은 Easy와 Multi의 두 가지 인터페이스를 제공합니다. 첫 번째는 동기식으로 작동하고 두 번째는 내가 제대로 한 경우 여러 요청을 동시에 만들 수 있고 비동기 방식으로 작동합니다.
Vala로 작성된 example을 찾았기 때문에 Easy 인터페이스를 사용하기로 했습니다.
마지막으로 해결해야 할 문제는
curl_perform
를 호출할 때 스레드를 차단하는 문제였습니다.나는 마음에 떠오른 첫 번째 솔루션을 사용하기로 결정했습니다. 즉, GLib.Task를 사용하여 별도의 스레드에서
curl_perform
를 호출하는 것입니다. 메인 스레드가 차단되는 것을 방지하고 앱이 올바르게 작동하도록 합니다. 다음은 예입니다.앱.발라:
void main() {
var curl = new Curl.EasyHandle();
// set curl options
var task = new Task (null, null, (source_obj, cl_task) => {
var curl_code = (Curl.Code)cl_task.propagate_int ();
assert_true(curl_code == Curl.Code.OK);
});
task.set_task_data (curl, null);
task.run_in_thread ((cl_task, source_obj, curl, cancellable) => {
unowned var cl_curl = (Curl.EasyHandle)curl;
var code = cl_curl.perform ();
cl_task.return_int (code);
});
}
Whaler에서 사용된 최종 솔루션은 Github에서 확인할 수 있습니다: HttpClient.vala
연결
질문 및 다음 단계
나는 그것이 Vala에서 HTTP 요청을 만드는 많은 가능한 방법 중 하나라고 생각합니다. 귀하의 의견을 듣고 싶습니다.
Reference
이 문제에 관하여(Vala에서 CURL을 사용하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/sdv43/how-to-use-curl-in-vala-i60텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)