https://webnautes.tistory.com/1159

 

Android PHP MySQL 예제 - 데이터베이스 질의(query) 결과 출력하기

안드로이드 앱에서 입력한 키워드를 웹서버에서 실행되는 PHP를 이용하여 MySQL 데이터베이스 서버에 질의하는 예제입니다. 질의 결과는 JSON 형식으로 가져와서 화면에 보여줍니다. 현재 예제에선 키워드를 2개..

webnautes.tistory.com

http://192.168.1.184/api_josn.php

불러오는 중입니다...

 

query.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php
error_reporting(E_ALL);
ini_set('display_errors',1);
include('dbcon.php');
//POST 값을 읽어온다.
$address=isset($_POST['address']) ? $_POST['address'] : '';
$name = isset($_POST['name']) ? $_POST['name'] : '';
$android = strpos($_SERVER['HTTP_USER_AGENT'], "Android");
if ($address != "" ){
    $sql="select * from Person where address='$address' and
        name='$name'";
    $stmt = $con->prepare($sql);
    $stmt->execute();
 
    if ($stmt->rowCount() == 0){
        echo "'";
        echo $address,", ",$name;
        echo "'은 찾을 수 없습니다.";
    } 
    else{
        $data = array();
        while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
            extract($row);
            array_push($data,
                    array('id'=>$row["id"],
                        'name'=>$row["name"],
                        'address'=>$row["address"]
                        ));
        }
        // if (!$android) {
        echo "<pre>";
        print_r($data);
        echo '</pre>';
        // }
    }
}
else {
    echo "검색할 나라를 입력하세요 ";
}
?>
<?php
//$android = strpos($_SERVER['HTTP_USER_AGENT'], "Android");
?>
<html>
<body>
 
<form action="<?php $_PHP_SELF ?>" method="POST">
이름: <input type = "text" name = "name" />
Address: <input type = "text" name = "address" />
<input type = "submit" />
</form>
 
</body>
</html>
<?php
?>
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs

 

postman

크롬브라우저에서 설치하는 RESTFULL API 도구

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
error_reporting(E_ALL);
ini_set('display_errors',1);
include('dbcon.php');
$sql="select * from Person";
$stmt = $con->prepare($sql);
$stmt->execute();
if ($stmt->rowCount() == 0){
    echo "'은 찾을 수 없습니다.";
}
else{
    $data = array();
    while($row=$stmt->fetch(PDO::FETCH_ASSOC)){
        extract($row);
        array_push($data,
                array('id'=>$row["id"],
                    'name'=>$row["name"],
                    'address'=>$row["address"]
                    ));
    }
    header('Content-Type: application/json; charset=utf8'); 
    $json = json_encode(array("data"=>$data),
            JSON_PRETTY_PRINT+JSON_UNESCAPED_UNICODE);
    echo $json;
}
?>
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs

 

 

 

sqlite

$ sudo apt install sqlite3 libsqlite3-dev

 

ex_sqlite1.c

$ gcc -o ex_sqlite1 ex_sqlite1.c -lsqlite3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <sqlite3.h>
#include <stdio.h>
 
int main(void) {
    
    sqlite3 *db;
    char *err_msg = 0;
    
    int rc = sqlite3_open("test.db"&db);
    
    if (rc != SQLITE_OK) {
        
        fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        
        return 1;
    }
    
    char *sql = "DROP TABLE IF EXISTS Cars;" 
                "CREATE TABLE Cars(Id INT, Name TEXT, Price INT);" 
                "INSERT INTO Cars VALUES(1, 'Audi', 52642);" 
                "INSERT INTO Cars VALUES(2, 'Mercedes', 57127);" 
                "INSERT INTO Cars VALUES(3, 'Skoda', 9000);" 
                "INSERT INTO Cars VALUES(4, 'Volvo', 29000);" 
                "INSERT INTO Cars VALUES(5, 'Bentley', 350000);" 
                "INSERT INTO Cars VALUES(6, 'Citroen', 21000);" 
                "INSERT INTO Cars VALUES(7, 'Hummer', 41400);" 
                "INSERT INTO Cars VALUES(8, 'Volkswagen', 21600);";
 
    rc = sqlite3_exec(db, sql, 00&err_msg);
    
    if (rc != SQLITE_OK ) {
        
        fprintf(stderr, "SQL error: %s\n", err_msg);
        
        sqlite3_free(err_msg);        
        sqlite3_close(db);
        
        return 1;
    } 
    
    sqlite3_close(db);
    
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs

 

 

sqlite3 test.db

.mod column

.headers on

select * from cars;

 

 

HTTP

 

● 기능

- WWW(World Wide Web) 상의 데이터 접근 시 사용되는 프로토콜 (TCP 80번 포트 사용)

- 하나의 페이지에서 다른 페이지로 이동하는 하이퍼텍스트 환경에서 효과적으로 이용됨

 

● 상태가 존재하지 않는 stateless 프로토콜

- HTTP는 TCP기반의 프로토콜

- 단순 응답 형식의 프로토콜

 

● 요청 메시지는 요청 라인, 헤더 정보, 메시지 바디, 총 3부분으로 구성

 

● 응답 메시지는 상태 라인, 헤더 정보, 메시지 바디로 3부분으로 구성

 

HTTP 메시지 구조

 

● 요청 메시지 : 정보, 자료 요청

 - 요청 라인, 헤더, 공백 라인, 본문으로 구성

● 응답 메시지 : 요청에 대한 응답

- 상태라인, 헤더, 공백라인, 본문으로 구성

 

요청 라인 (Request Line)

  • 메소드 : 서비스 수행 기능 명시
  • URL : 웹페이지 위치 정보
  • HTTP 버전 : HTTP 프로토콜 버전 정보 (현재 v1.1) , <major>.<minor>

 

상태 라인 (Status Line)

  • HTTP 버전 : 응답 메시지에서 사용하는 HTTP 버전
  • 상태 코드 : 요청 수락 및 수행 시도의 결과를 나타내는 3자리의 십진수 코드
  • 상태 설명 : 사용자를 위한 상태 코드의 설명

 

상태 코드

 

● 상태코드의 첫번째 십진수 의미

  • 1XX : 정보
  • 2XX : 성공,                  3XX : 재전송 요구
  • 4XX : 클라이언트 에러,   5XX : 서버 에러

 

● 승인된 상태코드 의미

코드 의미 코드 의미 코드 의미
200 OK 302 Found 404 Not Found
201 Created 304 Not Modified 500 Internal Server Error
202 Accepted 400 Bad Request 501 Not Implemented
204 No Content 401 Unauthorized 502 Bad GateWay
301 Moved Permanently 403 Forbidden 503 Service Unavailable

 

 

헤더(Header)

  • HTTP 송수신 메시지에서 모두 사용
  • 클라이언트와 서버간의 추가적인 정보 교환
  • 헤더 종류

- 일반 헤더 (General Header)

- 요청 헤더 (Request Header)

- 응답 헤더 (Response Header)

- 엔터티 헤더 (Entity Header)

 

일반 헤더

- 메시지에 대한 일반적인 정보 전달

 - Cache-Control, Connection, Date, Pragma, Transfer-Encoding, Upgrade, Via

 

요청 헤더

- 요청에 대한 추가 정보 및 클라이언트에 대한 정보 전달

- 요청 메시지에서만 이용

 

응답 헤더

- 서버의 구성과 응답에 대한 추가적이 정보 전달

- 응답 메시지에서만 이용

 

엔터티 헤더

- 문서의 본문에 대한 정보 전달

 

메소드 (Method)

 

● Get

- URL에 지정된 정보 획득

- 일반적인 웹 서핑 시 주로 이용

 

● Head

- 본문은 제외하고 헤더만을 전달 받음

- 기타 사항은 GET 메소드와 같음

 

● POST

- 클라이언트에서 서버로 정보를 전달

- 게시판, 카운터, 뉴스그룹, 메일링 리스트 등으로 메시지 전달 (CGI 프로그램에서 주로 사용)

 

HTTP 요청 메시지 (GET)

 

● 요청 라인

 - Get 메소드 이용

- HTTP 버전 1.1 사용

 

● 헤더 라인

- 요청 헤더 : Accept, Accept-Language, Accept-Encoding, User-Agent, Host,

- 일반 헤더 : Connection

 

● 상태 라인

- HTTP 버전 1.1 이용

- 302 Found : 요청한 자원이 일시적으로 다른 URL로 옮김

 

● 헤더 라인

- 일반 헤더 : Date, Connection, Transfer-Encoding, Content-Type

- 응답 헤더 : Location

 

 

web_server 실행 디렉토리에 index.html 을 만들어 놓고 실행

./web_server 8080

1. 브라우저 8080 포트 접속

1) http://YOUR_IP:8080/index.html

2) http://YOUR_IP:8080/index2.html <-에러 확인

web_server.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
/* web_server.c */
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>
#define BUFSIZE 1024
#define LINESIZE 512
static void *clnt_connection(void *arg);
void sendOk(FILE *fp);
void sendError(FILE *fp);
int sendData(int fd, FILE *fp, char *ct, char *file_name); 
int main(int argc, char **argv)
{
    int serv_sock;
    int clnt_sock;
    pthread_t thread;
    struct sockaddr_in serv_addr, clnt_addr;
    unsigned int clnt_addr_size;
    if (argc != 2)
    {
        printf("usage: %s <port>\n", argv[0]);
        return -1;
    }
    serv_sock = socket(PF_INET, SOCK_STREAM, 0);
    if (serv_sock == -1)
    {
        perror("socket() error");
        return -1;
    }
    memset(&serv_addr, 0sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = (argc != 2) ? htons(8000) :
        htons(atoi(argv[1]));
    if (bind(serv_sock, (struct sockaddr *)&serv_addr,
                sizeof(serv_addr)) == -1)
    {
        perror("bind() error");
        return -1;
    }
    if (listen(serv_sock, 10== -1)
    {
        perror("listen() error");
        return -1;
    }
    while (1)
    {
        clnt_addr_size = sizeof(clnt_addr); 
        clnt_sock = accept(serv_sock, (struct sockaddr
                    *)&clnt_addr, &clnt_addr_size);
        printf("Client IP : %s:%d\n",
                inet_ntoa(clnt_addr.sin_addr),
                ntohs(clnt_addr.sin_port));
        pthread_create(&threadNULL, clnt_connection,
                &clnt_sock);
        pthread_join(thread0);
    };
    return 0;
}
void *clnt_connection(void *arg)
{
    int clnt_sock = *((int *)arg), clnt_fd;
    char reg_line[LINESIZE], reg_buf[LINESIZE];
    FILE *clnt_read, *clnt_write;
    char method[10], ct[LINESIZE], type[LINESIZE];
    char file_name[256], file_buf[256];
    char *type_buf;
    int i = 0, j = 0, len = 0;
    clnt_read = fdopen(clnt_sock, "r");
    clnt_write = fdopen(dup(clnt_sock), "w");
    clnt_fd = clnt_sock;
    fgets(reg_line, LINESIZE, clnt_read);
    fputs(reg_line, stdout);
    strcpy(method, strtok(reg_line, "/ "));
    if (strcmp(method, "POST"== 0)
    {
        sendOk(clnt_write);
        fclose(clnt_read);
        fclose(clnt_write);
        return (void *)NULL;
    }
    else if (strcmp(method, "GET"!= 0)
    { 
        sendError(clnt_write);
        fclose(clnt_read);
        fclose(clnt_write);
        return (void *)NULL;
    }
    strcpy(file_name, strtok(NULL" "));
    if (file_name[0== '/')
    {
        for (i = 0, j = 0; i < LINESIZE; i++)
        {
            if (file_name[0== '/')
                j++;
            file_name[i] = file_name[j++];
            if (file_name[i + 1== '\0')
                break;
        };
    }
    do
    {
        fgets(reg_line, LINESIZE, clnt_read);
        fputs(reg_line, stdout);
        strcpy(reg_buf, reg_line);
        type_buf = strchr(reg_buf, ':');
        if (!strncmp(reg_buf, "Content-Type"12))
            ;
    } while (strncmp(reg_line, "\r\n"2));
    strcpy(file_buf, file_name);
    sendData(clnt_fd, clnt_write, ct, file_name);
    fclose(clnt_read);
    fclose(clnt_write);
    pthread_exit(0);
    return (void *)NULL;
}
int sendData(int fd, FILE *fp, char *ct, char *file_name)
    char protocol[] = "HTTP/1.1 200 OK\r\n";
    char server[] = "Server:Netscape-Enterprise/6.0\r\n";
    char cnt_type[] = "Content-Type:text/html\r\n";
    char end[] = "\r\n";
    char buf[BUFSIZE];
    int len;
    fputs(protocol, fp);
    fputs(server, fp);
    fputs(cnt_type, fp);
    fputs(end, fp);
    fflush(fp);
    fd = open(file_name, O_RDWR);
    do
    {
        len = read(fd, buf, BUFSIZE);
        fwrite(buf, len, sizeof(char), fp);
    } while (len == BUFSIZE);
    fflush(fp);
    close(fd);
    return 0;
}
void sendError(FILE *fp)
{
    char protocol[] = "HTTP/1.1 400 Bad Request\r\n";
    char server[] = "Server:Best HTTP Server\r\n";
    char cnt_len[] = "Content-Length:1024\r\n";
    char cnt_type[] = "Content-Type:text/html\r\n\r\n";
    char content1[] = "<html><head><title>BAD Connection</tiitle></head>";
    char content2[] = "<body><font size=+5>Bad Request</font></body></html>";
    printf("send_error\n");
    fputs(protocol, fp);
    fputs(server, fp); 
    fputs(cnt_len, fp);
    fputs(cnt_type, fp);
    fputs(content1, fp);
    fputs(content2, fp);
    fflush(fp);
    return;
}
void sendOk(FILE *fp)
{
    char protocol[] = "HTTP/1.1 200 OK\r\n";
    char server[] = "Server:Best HTTP Server\r\n\r\n";
    fputs(protocol, fp);
    fputs(server, fp);
    fflush(fp);
    return;
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs

 

2. web_client 로 8080 포트 접속

web_client.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/* web_client.c */
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <resolv.h>
#include <errno.h>
#define MAXBUF 1024
int main(int argc, char *argv[])
{
    int sockfd, bytes_read;
    struct sockaddr_in dest;
    char buffer[MAXBUF];
    if (argc != 3)
    {
        printf("usage: %s <IP-addr> <send-msg>\n", argv[0]);
        return -1;
    }
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("Socket");
        return -1;
    }
    memset(&dest, 0sizeof(dest));
    dest.sin_family = AF_INET;
    dest.sin_addr.s_addr = inet_addr(argv[1]);
    dest.sin_port = htons(8080);
    // if (inet_addr(argv[1]) == 0)
    // {
    // perror(argv[1]);
    // return -1;
    // }
    if (connect(sockfd, (struct sockaddr *)&dest, sizeof(dest)) ==
            -1)
    {
        perror("Connect");
        return -1;
    }
    sprintf(buffer, "GET %s HTTP/1.0\r\n\r\n", argv[2]);
    printf("%s\n", buffer);
    send(sockfd, buffer, strlen(buffer), 0);
    do
    {
        bzero(buffer, sizeof(buffer));
        bytes_read = recv(sockfd, buffer, sizeof(buffer), 0);
        if (bytes_read > 0)
            printf("%s", buffer);
    } while (bytes_read > 0);
    close(sockfd);
    return 0;
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4f; text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none; color:white">cs

 

+ Recent posts