Core Mission¶
- 제출할 파일 : bicsubi_core_api.md, Api 구축에 사용되는 파일들
- 다음의 명세에 맞게 API 작성
GET /whoami
- 우리의 github id를 반환합니다.
- Example
In [ ]:
{
"name" : "super-corini"
}
GET /echo?value = "..."
- Query String : value
- value를 반환합니다.
In [ ]:
{
"value" : "..."
}
- 아래의 요구사항에 맞게 API를 설계하고 작성한다.
- 빅스비는 자원
weapon
을 가진다.weapon
은 이름(name : str)과 수량(stock : int)을 가지며, 각각에 대해 CRUD를 진행할 수 있다.- Create : 새로운
weapon
추가 - Read : 현재
weapon
확인 - Update : 현재 존재하는
weapon
에서 이름 및 수량 변경 - Delete : 현재 존재하는 특정
weapon
삭제
- Create : 새로운
- 작성한 API에 대한 명세(API Docs)를 bicsubi_core_api.md에 작성하여 제출
- 모든 API는 작성자가 설계한대로 동작할 것.
해결1. GET /whoami에 대하여
- 사용자의 github id를 반환하는 기능을 수행합니다.
- 다만, 동적으로는 처리하는 방법을 찾지 못해 오직 제 id만 반환합니다.
In [ ]:
# 사용자의 github id 반환하는 주소입니다.
@app.route('/whoami', methods = ['GET'])
def github_id():
# 지정된 주소값의 응답을 response에 저장한다.
# response는 객체형태로 응답한다.
response = requests.get('https://api.github.com/users/ysjin0715')
# 객체형태로 온 response를 json형태로 바꾸어 user에 저장한다.
user = response.json()
# json형태의 user파일에서 'login' key를 이용해 아이디를 추출하여 반환
user_id = {
"name" : user.get('login')
}
return user_id
해결2. GET/echo?value='xxx'에 대하여
request.args.get
를 이용합니다.- 실제 사용시 "echo?value=값"을 주소창에 입력하여 사용하도록 만듭니다.
In [ ]:
# 입력된 value 반환
@app.route('/echo')
def value():
# /echo 뒤에 value=데이터값을 입력받을 경우, = 뒤의 값을 value에 저장한다.
value = request.args.get('value',default = "*", type = str)
# value에 저장된 값을 형태에 맞게 출력한다.
value_dic = {
"value" : value
}
return value_dic
해결3. Weapon에 관한 CRUD만들기
- '/weapon'이라는 별도의 구역을 생성하여 기능 구분
- weapon = []을 생성하고, 여기에 세부 weapon값을 crud하는 것으로 구현함.
3.1. Create
- body에 입력한 값을 weapon이라는 list에 삽입
In [ ]:
# Create : 새로운 weapon 추가
@app.route('/weapon', methods = ['POST'])
def create_weapon():
request_data = request.get_json()
# 새로운 weapon 생성
new_weapon = {
"name" : str(request_data['name']),
"stock" : int(request_data['stock']),
}
weapon.append(new_weapon)
return jsonify(weapon)
3.2. Read
- 현재 weapon 리스트를 확인한다.
In [ ]:
# Read : 현재 weapon 확인
@app.route('/weapon')
def get_weapon():
return jsonify(weapon)
3.3. Update
- 이름을 기준으로 현재 존재하는 weapon에서 name과 stock을 변경한다.
- 단, 동일한 이름이 두 개 이상 존재할 경우, 가장 앞의 내용을 변경한다.
In [ ]:
@app.route('/weapon/<string:name>', methods = ['PUT'])
def update_weapon(name):
request_data = request.get_json()
# change_weapon에 입력받은 값 저장
change_weapon = {
"name" : str(request_data['name']),
'stock' : int(request_data['stock']),
}
# for문이 돌아가는 동안
for i in range(len(weapon)):
# 만약 i번째 weapon의 'name'이 입력받은 name과 같을 경우
if name == weapon[i].get('name'):
# i번째 weapon 값의 'name'을 입력받은 값으로 교체합니다.
weapon[i]['name'] = change_weapon['name']
# i번째 weapon 값의 'stock'을 입력받은 값으로 교체합니다.
weapon[i]['stock'] = change_weapon['stock']
break
return jsonify(weapon)
3.4. Delete
- 이름을 기준으로 현재 존재하는 weapon값을 삭제한다.
- 만약 두 개 이상의 동일한 이름이 존재할 경우, 가장 앞의 내용을 삭제한다.
In [ ]:
# Delete : name값을 기준으로 현재 존재하는 weapon값 삭제
@app.route('/weapon/<string:name>', methods = ["DELETE"])
def delete_weapon(name):
index_num = -1
# for문이 돌아가는 동안
for i in range(len(weapon)):
# 만약 i번째 weapon의 'name'이 입력받은 name과 같을 경우
if name == weapon[i].get('name'):
# i번째 리스트를 통째로 삭제한다.
# 같은 이름을 가진 두 개의 값이 존재할 경우, 가장 첫 번째를 삭제한다.
index_num = i
break
if index_num != -1:
del weapon[index_num]
return jsonify(weapon)
if __name__ == '__name__':
app.run()
Extra Mission¶
- 다음의 명세서에 맞게 API를 설계하고 작성합니다.
- 현재 위치의 위도와 경도 값을 이용해 현재 위치의 날씨(온도, 바람세기 등)을 알 수 있는 API
- 현재 위치의 위도와 경도 값을 이용해 현재 위치에서 가장 가까운 버스 정류장의 도착정보를 알 수 있는 API
- 이외에 빅수비에 추가하고 싶은 API가 있다면 추가하셔도 좋습니다.
- Swagger를 이용해 API docs를 만듭니다.
- 작성한 API에 대한 명세(API Docs)를 bicsubi_extra_api.md 에 작성하여 제출합니다.
- 모든 API는 작성자가 설계한대로 원활하게 동작되어야합니다.
- 이 과제는 필수 과제 이후에 진행되어야합니다.
- 다음날 오전 12시 58분에 Core Mission을 끝냈으므로 Extra Mission은 시간관계상 수행하지 않는다.
'전문지식 함양 > TIL' 카테고리의 다른 글
[프로그래머스 겨울방학 인공지능 과정] EDA Project1 (0) | 2022.01.14 |
---|---|
[프로그래머스 겨울방학 인공지능 과정] EDA example (0) | 2022.01.13 |
[프로그래머스 겨울방학 인공지능 과정] Flask with REST API (0) | 2022.01.11 |
[프로그래머스 겨울방학 인공지능 과정] Flask 기초 (0) | 2022.01.10 |
[프로그래머스 겨울방학 인공지능 과정] 1주차 실습과제 (0) | 2022.01.09 |