https://webnautes.tistory.com/1159
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;
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, 0, 0, &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, 0, sizeof(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(&thread, NULL, clnt_connection,
&clnt_sock);
pthread_join(thread, 0);
};
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, 0, sizeof(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 |
'딥러닝 기반 영상인식 개발 전문가 과정 > 리눅스' 카테고리의 다른 글
6월19일 systemd 데몬서비스 (0) | 2019.06.19 |
---|---|
6월19일 접속로그 DB저장 실습, json 실습 (0) | 2019.06.19 |
6월18일 mysql, php 실습 (0) | 2019.06.18 |
6월18일 멀티쓰레드 기반의 다중접속 서버의 구현 (0) | 2019.06.18 |
6월17일 멀티캐스트, 브로드캐스트, 쓰레드, HTTP (0) | 2019.06.17 |