본문 바로가기
IT/programming

Rest API 요청 언어별 정리, CURL/PHP/PYTHON/C/C++/QT/JAVA/Node.js

by 어느해겨울 2022. 1. 17.

Rest API 요청 언어별 정리

 

Rest API 호출 방식 소스코드를 각 언어 별로 정리해보았다.

무엇을 좋아할지 몰라 잔뜩 준비 했으니 쓸모가 있었으면 좋겠다.

준비한 언어 목록은 다음과 같다.

- 목록 -

1. CURL

2. PHP

3. PYTHON

4. C/C++

5. QT

6. JAVA

7. Node.js


# 소스코드

- 각각의 요청은 http://httpbin.org/get 를 대상으로한다.

- GET method 한정하여 작성. 코드 내 POST로 변경할 수 있는 요소들이 있으니 필요하면 수정해서 사용할 것.

- 모든 request의 response 응 동일하기 때문에 가장 아래에 응답 결과로 정리한다.

 

1. CURL
- OS: Ubuntu 16.04.7 LTS, Version: curl 7.79.1

curl -H "Content-Type: application/json" -X GET http://httpbin.org/get

 

2. PHP
- OS: Ubuntu 16.04.7 LTS, Version: PHP 7.0.33-0ubuntu0.16.04.16 (cli) ( NTS )

<?php
    // 1. Method 타입을 정의하고 장치에 요청할 URI를 입력한다.
    $is_method_post = false;
    $str_url        = "http://httpbin.org/get";

    $arr_headers = array(
        "Content-type : application/json"
    );

    // 2. API를 전송한다.
    $curl_handler = curl_init();
    curl_setopt($curl_handler, CURLOPT_URL,             $str_url);
    curl_setopt($curl_handler, CURLOPT_RETURNTRANSFER,  true);
    curl_setopt($curl_handler, CURLOPT_HTTPHEADER,      $arr_headers);
    curl_setopt($curl_handler, CURLOPT_POST,            $is_method_post);

    $str_response = curl_exec($curl_handler);
    curl_close($curl_handler);

    echo json_encode(json_decode($str_response), JSON_PRETTY_PRINT) . "\n";
?>

 

3. PYTHON
- OS: Ubuntu 16.04.7 LTS, Version: Python 3.5.2

import requests
import json
import pprint

# 1. 장치에 요청할 URI를 입력한다.
str_url = "http://httpbin.org/get"

arr_headers = { "Content-Type" : "application/json" };

# 2. Method 타입을 정의하고 API를 전송한다.
str_response = requests.get(str_url, headers=arr_headers)
    
pprint.pprint(json.loads(str_response.text), indent=2)

 

4. C/C++
- OS: Ubuntu 16.04.7 LTS, Version: g++ (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0

#include <curl/curl.h>

#include <iostream>
#include <string>

using namespace std;

size_t write_callback(void *_contents, size_t _size, size_t _nmemb, void *_userp) {
    ((string *)_userp)->append((char *)_contents, _size * _nmemb);

    return _size * _nmemb;
}

int main(int _argc, char *_argv[]) {
    CURL        *curl_handle;
    CURLcode    curl_ret_code;
    string      read_buffer;

    struct      curl_slist *t_headers;

    curl_handle = curl_easy_init();

    // 1. 장치에 요청할 URI를 입력한다.
    curl_easy_setopt(curl_handle, CURLOPT_URL, "http://httpbin.org/get");

    curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION,    write_callback);
    curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA,        &read_buffer);
    curl_easy_setopt(curl_handle, CURLOPT_HTTPHEADER,       t_headers);

    // 2. HTTP 공용/인증 헤더의 KEY/VALUE를 입력한다.
    t_headers = curl_slist_append(t_headers, "Content-Type : application/json");

    // 3. API를 전송한다. (기본 GET)
    read_buffer = "";
    curl_ret_code = curl_easy_perform(curl_handle);

    if( curl_ret_code != CURLE_OK ) {
        read_buffer = string(curl_easy_strerror(curl_ret_code));
    }

    cout << read_buffer << endl;

    return 0;
}

 

5. QT
- OS: Windows 10, Version: c++11, QT 5.12.10

#include <QtNetwork/QNetworkRequest>
#include <QtNetwork/QNetworkAccessManager>
#include <QtNetwork/QNetworkReply>
#include <QJsonObject>
#include <QJsonDocument>
#include <QLabel>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
      , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    request();
    label = new QLabel(this);
    this->setCentralWidget(label);
    label->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::request()
{
    // 1. 장치에 요청할 URI를 입력한다.
    QUrl url(QString("http://httpbin.org/get"));
    QNetworkRequest request(url);

    request.setRawHeader("Content-Type", "application/json");

    // 2. API를 전송한다.
    QNetworkAccessManager *manager= new QNetworkAccessManager(this);
    QNetworkReply *reply = manager->get(request);

    // 3. 리턴값을 받았을 때 처리할 함수를 연결한다.
    connect(reply, SIGNAL(readyRead()), this, SLOT(readyRead()));
}

void MainWindow::readyRead()
{
    qDebug() << __PRETTY_FUNCTION__;
    auto repl = qobject_cast<QNetworkReply *>(sender());
    QByteArray data = repl->readAll();
    QJsonDocument doc = QJsonDocument::fromJson(data);

    label->setText(doc.toJson(QJsonDocument::Indented));
}

 

6. JAVA
- OS: Ubuntu 16.04.7 LTS, Version: openjdk version "1.8.0_292"

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class Test {
    public static void main(String[] _args) throws Exception {
        // 1. 장치에 요청할 URI를 입력한다.
        URL url = new URL("http://httpbin.org/get");
        HttpURLConnection con = (HttpURLConnection)url.openConnection();

        con.setRequestProperty("Content-Type", "application/json");

        // 2. Method 타입을 정의하고 API를 전송한다.
        con.setRequestMethod("GET");
        con.getResponseCode();

        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));

        String inputLine;
        StringBuffer response = new StringBuffer();

        while ((inputLine = in.readLine()) != null) {
            response.append(inputLine);
        }
        in.close();

        System.out.println(response.toString());
    }
}

 

7. Node.js
- OS: Ubuntu 16.04.7 LTS, Version: nodejs v6.9.2

const request = require('request');

let options = {
    // 1. Method 타입을 정의하고 장치에 요청할 URI를 입력한다.
    uri     : "http://httpbin.org/get",
    method  : "GET",

    headers : {
        "Content-Type" : "application/json",
    },
    json    : true 
};

// 2. API를 전송한다.
request(options, function(_err, _response, _body) {
    console.log(_body);

    return ;
})

 

 

# 응답 결과

- 모두 request 는 동일한 서버로 발생하기 때문에 response 또한 같다.

{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Content-Type": "application/json",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.79.1",
    "X-Amzn-Trace-Id": "Root=1-61e4c4e8-52b38b0d2ed212606ff49814"
  },
  "origin": "218.159.195.251",
  "url": "http://httpbin.org/get"
}

 

정리할 땐 뭔가 많았는데 써 놓고 보니 별거 없어 보인다.

그래도 샘플 코드가 필요한 분들에게 도움이 되길 바란다.

 

끝.

 

 

댓글