1. Manifest 수정 - permission 허용, http 허용
우선 Rest API를 사용하기 위해서는 인터넷 네트워크 사용을 해야하기 때문에 Permission이 필요하다.
App\manifests\AndroidManifest.xml에서 다음 [그림 1] 과 같이 <manifest> </manifest> 사이에 다음 코드를 넣어준다.
(참고: developer.android.com/training/basics/network-ops/connecting?hl=ko)
코드를 본문에 적고 싶은데 퍼미션 관련 코드는 필터링 되는 모양이다. 본문에 안나온다. 그래서 위 링크를 들어가서 복붙하는 것을 추천한다.
또 기상청에서 제공하는 EndPoint를 보면 "http://..."로 되어있는데 이는 안드로이드에서 "https"가 아니라고 에러를 만든다.
그렇기 때문에 manifest에 가서 <application 안에 다음과 같이 코드를 입력해주어야한다.
android:usesCleartextTraffic="true"
2. mainThread 사용 방지
main Thread에서 바로 네트워킹 작업을 시도하면 다음과 같은 에러가 뜬다.
이렇게 에러가 뜬다는 사실은 android developer사이트에서도 친절하게 알려준다.
NetworkOnMainThreadException 문제는 그냥 네트워킹을 다른 Thread에서 해주면 되는거다.
이에 대한 해결 방법을 찾아보면 다들 이 클래스를 발견할 텐데 사용하지말자.
이 Class는 API30부터 deprecated되었기 때문에 사용하지 않는다.
그러므로 [그림 5]에서 써있는 것 처럼 java.util.concurrent를 대신 써주자.
나는 api를 다룰 클래스 파일로 apiTest.java파일을 하나 새로 만들고 mainActivity.java에서 다음과 같이 호출했다.
AsyncTask를 사용하는 대신 java.util.concurrent의 Executors를 사용하여 새 Thread를 만들어 실행시켰다.
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import org.json.JSONException;
import java.io.IOException;
import java.util.concurrent.Executors;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final apiTest at = new apiTest();
Executors.newSingleThreadExecutor().execute(new Runnable() {
@Override
public void run() {
try {
at.func();
} catch (IOException | JSONException e) {
e.printStackTrace();
}
}
});
}
}
3. 동네예보 API 호출하기
이제 거의 끝났다. 공공데이터포털(www.data.go.kr/index.do) 에서
마이페이지에 들어가서 신청한 OpenAPI>개발계정에서 해당 API의 일반 인증키를 보러가자.
이제 이 키를 이용해서 API를 호출한다.
코드는 다음과 같다.
apiTest.java
코드 설명.
Line | Comments |
11 | 위에서 본 바와 같이 MainActivity에서 해당 클래스의 이 함수를 호출한다. |
12~19 | 기상청 동네예보 api에서 동네예보조회 요청에 필요한 매개변수들이다. 어떤 매개변수가 필요한지, 매개변수의 뜻은 무엇인지 궁금하다면 [그림 6]에 나와있듯이 홈페이지 참고 문서에 있는 첨부파일인 동네예보 조회서비스 오픈 api 활용가이드를 읽으면 된다!! 꼭 읽어보길 추천한다. |
21 | endpoint와 원하는 정보(동네예보조회:getVilageFcst), 서비스키와 기타 요청 매개변수들을 다 합친 쿼리 스트링이다. dataType은 나는 항상 JSON으로 받을 것이기 때문에 다른 변수를 사용하지 않고 그냥 그대로 박아뒀다. |
30~32 | Http연결을한다. 호출 Method는 "GET"이다. 연결이 잘 됐는지 궁금하면 다음 코드로 넘어가지말고 Log나 System.out.print로 conn.getResponseCode()를 찍어보자. 200이 나와야한다. 해당 값의 뜻이 궁금하면 httpCode 검색해 볼 것. |
35~47 | BufferedReader를 이용해서 리턴값을 받고 StringBuilder를 이용해서 라인마다 한줄씩 추가하여 저장한다. BufferedReader사용을 마쳤으면 close해주어야한다. 이후 StringBuilder로 한줄 한줄 저장한 값을 새 String에 저장해주고 http connection도 끊어준다. |
49~56 | 이제부턴 이 리턴 값을 어떻게 요리해주는 지 마음대로 하면된다. String으로 된 JSON값을 parse해주자. (아래 [그림 7]을 참고하자) 우리가 원하는 값은 상당히 안쪽에 있기 때문에 item이라는 JSONArray가 나올 때 까지 파고 든다. 이후 Array길이만큼 원하는 값을 String으로 뽑아주면 된다. 해당 값의 의미는 API문서를 참고하자. 밑에 내가 써줄거지만. |
다음은 fcstValue의미이다. api참조 문서에 자세히 나와있다.
이제 얻은 값으로 마음 껏 원하는 것을 만들길.
글이 도움 됐다면 하트❤️
'컴퓨터' 카테고리의 다른 글
[에러해결] 깃헙 토큰 받고 push하는 법 정리 - remote: Password authentication is temporarily disabled as part of a brownout. Please use a personal access token instead. (0) | 2021.07.01 |
---|---|
네이버 지도 API로 웹에 지도 붙이기 (Web Dynamic Map) (0) | 2021.05.21 |
Unity 안드로이드 모바일 Build And Run 했는데 Application이 설치가 안되어있는 경우 (0) | 2021.02.10 |
MacOs 유니코드(UTF-8) 텍스트 인코딩이 적용되지 않습니다 오류 (0) | 2020.07.22 |
[c++] 삼항연산자 (조건식) (0) | 2020.03.25 |
댓글