package com.test.httpConnection01;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
public class HttpConnectionTest01 {
private static final String USER_AGENT = "Mozila/5.0";
private static final String GET_URL = "http://www.google.com";
public static void sendGet() throws ClientProtocolException, IOException {
//http client 생성
CloseableHttpClient httpClient = HttpClients.createDefault();
//get 메서드와 URL 설정
HttpGet httpGet = new HttpGet(GET_URL);
//agent 정보 설정
httpGet.addHeader("User-Agent", USER_AGENT);
//get 요청
CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
System.out.println("::GET Response Status::");
//response의 status 코드 출력
System.out.println("status code: "+httpResponse.getStatusLine().getStatusCode());
BufferedReader reader = new BufferedReader(new InputStreamReader(
httpResponse.getEntity().getContent()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = reader.readLine()) != null) {
response.append(inputLine);
}
reader.close();
//Print result
System.out.println(response.toString());
httpClient.close();
}
}
그리고 위 메소드를 실행할 파일을 하나 만든다.
파일명: HttpConnectionTextExec.java
package com.test.httpConnection01;
import java.io.IOException;
import org.apache.http.client.ClientProtocolException;
public class HttpConnectionTextExec {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
//예제1 connection 테스트
HttpConnectionTest01.sendGet();
//System.out.println("==============비트코인 가격 json 시작=================");
//예제2 비트코인가격 Json
//HttpConnectionTest02.sendGet();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
코드를 완성 한 후 실행하면 아래와 같은 결과를 얻는다.
::GET Response Status:: status code: 200 <!doctype html><html itemscope="" itemtype="http://schema.org/WebPage"
그런데 json을 받아오는 경우가 많으므로 json 예제파일을 하나 더 만들어보자.
파일명: HttpConnectionTest02
package com.test.httpConnection01;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class HttpConnectionTest02 {
private static final String USER_AGENT = "Mozila/5.0";
//비트코인 가격 json API 주소
private static final String GET_URL = "https://api.blockchain.com/v3/exchange/tickers/"+
"BTC-USD";
public static void sendGet() throws ClientProtocolException, IOException {
//http client 생성
CloseableHttpClient httpClient = HttpClients.createDefault();
//get 메서드와 URL 설정
HttpGet httpGet = new HttpGet(GET_URL);
//agent 정보 설정
httpGet.addHeader("User-Agent", USER_AGENT);
httpGet.addHeader("Content-type", "application/json");
//get 요청
CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
System.out.println("status code: "+httpResponse.getStatusLine().getStatusCode());
String json = EntityUtils.toString(httpResponse.getEntity(), "UTF-8");
System.out.println(json);
httpClient.close();
}
}
그리고 실행 파일에서 예제1에 주석을 걸고, 예제2 비트코인 가격 부분 주석을 푼다.
package com.test.httpConnection01;
import java.io.IOException;
import org.apache.http.client.ClientProtocolException;
public class HttpConnectionTextExec {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
//예제1 connection 테스트
//HttpConnectionTest01.sendGet();
System.out.println("==============비트코인 가격 json 시작=================");
//예제2 비트코인 가격
HttpConnectionTest02.sendGet();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
그러면 결과값은 아래와 같다.
==============비트코인 가격 json 시작================= status code: 200 {"symbol":"BTC-USD","price_24h":35775.7,"volume_24h":63.66743294,"last_trade_price":35717.4}
더나아가서 비트코인 가격만 나타나려고 하면 json으로 그 값을 저장하는 변수를 추가해줘야한다.
pom.xml에 아래와 같이 GSON 메이븐을 추가해준다. (json-simple이 아닌 gson이다.)
에러 java.sql.Timestamp cannot be cast to java.lang.String
DB에 timestamp 타입의 열을 만들면 자바에서 위의 에러를 뱉어낼 때가 있다.
이럴때는 쿼리문 또는 자바에서 데이트포맷을 변경해주어야 한다.
예를 들어 xml파일에 아래의 쿼리문을 입력하면
SELECT MEMBER_ID, MEMBER_PASS, LOGIN_DATE
FROM MEMBER
LOGIN_DATE의 데이터타입이 timestamp라면 java.sql.Timestamp cannot be cast to java.lang.String 에러를 띄우게 되는데 그때는 아래의 쿼리문으로 바꾸면 된다.
SELECT MEMBER_ID, MEMBER_PASS,
DATE_FORMAT(LOGIN_DATE, '%Y-%m-%d %H:%i:%s') AS LOGIN_DATE
FROM MEMBER
march, june같은 영어 월로 바꾸려면 %m을 %M으로 바꾸면된다.
또한 2020-07-08 08:20:05 <<이런 데이터를 15914634~~같은 UNIX타입으로 변화시키려면 아래 자바코드를 이용한다.
import java.util.Date
//String으로 되어 있는 날짜를 UNIX타입으로 저장
java.sql.Timestamp date_timestamp01 = java.sql.Timestamp.valueOf(date_string);
long date_timestamp02 = date_timestamp01.getTime(); //date_timestamp02의 값은 159823~~~값을 가진다.
//현재 시간을 UNIX타입 으로 저장하는 코드
Long now01 = System.currentTimeMillis();
//현재 시간을 yyyy-MM-dd HH:mm:ss 포맷으로 저장하는 코드
Date now = new Date(); //Date타입으로 변수 선언
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //데이트 포맷
String date_string = dateFormat.format(now); //날짜가 string으로 저장
2) com.mysql.persistence에 memberDAOImpl.java를 생성하여 아래 코드들을 넣는다.
MemberDAOImpl.java
package com.mysql.persistence;
import org.springframework.stereotype.Repository;
import com.mysql.domain.MemberVO;
@Repository
public class MemberDAOImpl extends GenericDAOImpl<MemberVO, String> implements MemberDAO {
}
3) com.mysql.persistence에 GenericDAO.java를 생성하여 아래 코드들을 넣는다.
GenericDAO.java
package com.mysql.persistence;
import java.util.List;
public interface GenericDAO<E, K> {
public K getTime();
public void register(E vo);
public E get(K userid);
public List<E> getList();
// 아래는 등록, 조회 구현 이후에 할 것임..
//public void update();
//public void delete();
}// interface
4) com.mysql.persistence에 GenericDAOImpl.java를 생성하여 아래 코드들을 넣는다.
GenericDAOImpl.java
package com.mysql.persistence;
import java.util.List;
import javax.inject.Inject;
import org.apache.ibatis.session.SqlSession;
// GenericDAO 인터페이스의 추상클래스들을 오버라이딩 해주어야 한다.
// 즉, 여기서 DB와 연결을 하고 SQL문을 처리해주어야 하므로 sessionTemplate을 인스턴스 변수로 갖고서
// 이를 통해 CRUD 작업을 처리해주면 된다.
public abstract class GenericDAOImpl<E, K> implements GenericDAO<E, K> {
@Inject
private SqlSession sqlSession;
private static final String namespace =
"com.mysql.mapper.MemberMapper";
@Override
public K getTime() {
return sqlSession.selectOne(namespace + ".getNow");
}
@Override
public void register(E vo) {
sqlSession.insert(namespace + ".register", vo);
}
@Override
public E get(K userid) {
return sqlSession.selectOne(namespace + ".get", userid);
}
@Override
public List<E> getList() {
return sqlSession.selectList(namespace + ".getList");
}
}// class
5) com.mysql.persistence에 TimeDao.java를 생성하여 아래 코드들을 넣는다.
나는 Balance 정보 20999000를 불러오려고 할 때, Json parsing을 이용한다.
위의 데이터가 response1에 저장되어 있다고 가정한다.
JsonParser jsonParser= new JsonParser(); //JsonParser를 불러온다.
JsonObject jsonObj= (JsonObject) jsonParser.parse(response1); //reponse1을 오브젝트 형식으로 파싱함
JsonElement jsonElem = jsonObj.get("result");
//우리가 원하는 데이터는 result: 뒤에 있는 부분이므로 JsonElement로 result 부분을 가져와준다.
System.out.println("Balance: "+jsonElem.getAsJsonObject().get("account_data").getAsJsonObject().get("Balance"));
System.out.println("원장번호: "+jsonElem.getAsJsonObject().get("ledger_index"));
//getAsJsonObject().get("인덱스명")을 통해서 값을 가져올 수 있다.