Vala에서 CURL을 사용하는 방법

7163 단어 gtkvalacurlglib
안녕하세요 여러분! 오늘날 HTTP 요청을 만드는 Vala로 작성된 많은 애플리케이션과 이를 도울 수 있는 다양한 라이브러리가 있습니다. 동시에 curl을 통해 요청하는 방법에 대한 정보가 부족합니다. 이 글은 그 간극을 메우기 위한 것입니다.

Whaler 앱에서 작업하는 동안 이러한 정보 부족에 직면했습니다. 앱은 Docker 엔진 API 메서드를 호출하여 내부적으로 Docker 컨테이너를 관리합니다.

프로젝트를 시작할 때 HTTP 요청을 하려면 어떤 라이브러리를 사용해야 합니까?라는 질문에 직면했습니다. 중요한 요구 사항이 있었습니다. 라이브러리는 UNIX 소켓을 지원해야 했습니다.

세 가지 옵션이 있습니다.
  • GLib.소켓
  • libsoup-2.4
  • libcurl

  • 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

    연결


  • Richard-W의 컬 예
  • List of Vala Bindings
  • CURL Manual

  • 질문 및 다음 단계



    나는 그것이 Vala에서 HTTP 요청을 만드는 많은 가능한 방법 중 하나라고 생각합니다. 귀하의 의견을 듣고 싶습니다.
  • Vala용 다른 HTTP 라이브러리가 있습니까?
  • GLib.Task를 사용하지 않고 솔루션을 생성할 수 있습니까? 멀티 인터페이스가 도움이 될까요?
  • 좋은 웹페이지 즐겨찾기