본문 바로가기
Android

[Android/Java] Volley + JsonAPI사용

by noddu 2022. 1. 11.
728x90
반응형

 

json형태의 api키를 가져와서 붙여주는데

 


 

    final TextView textView = (TextView) findViewById(R.id.text);
    // ...

    // Instantiate the RequestQueue.
    RequestQueue queue = Volley.newRequestQueue(this);
    String url ="http://www.google.com";

    // Request a string response from the provided URL.
    StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            // Display the first 500 characters of the response string.
            textView.setText("Response is: "+ response.substring(0,500));
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            textView.setText("That didn't work!");
        }
    });

    // Add the request to the RequestQueue.
    queue.add(stringRequest);

안드로이드 스튜디오 예제에서

Volley를 사용하여 네트워크 데이터 전송 -> 간단한 요청보내기의 Java 샘플 코드를 NewsActivity에 함수로 만들어준다.

 

 

 

public void getNews() {

    String url = "https://newsapi.org/v2/top-headlines?country=kr&apiKey=28d52abfe26f4f0488faff173822d17c";

    StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    //textView.setText("Response is: "+ response.substring(0,500));
                    Log.d("News",response);
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            //textView.setText("That didn't work!");
        }
    });

    // Add the request to the RequestQueue.
    queue.add(stringRequest);

}

 

함수 이름은 getNews로 지었고

RequestQueue는 전역변수로 만들었다. ( + onCreate )

 

 

 

queue = Volley.newRequestQueue(this);
getNews();

이 getNews함수는

onCreate안에서 초기화하는 다음 구문에 실행하게 하면 된다.

 

 

 

 

adapter = new NewsAdapter(myDataset);
recyclerview.setAdapter(adapter);

그리고 원래 이 부분을 onResponse안에 넣어서 성공할때만 Adapter에 보낸다

 

 

 


 

Data

public class NewsData implements Serializable {
    private String title;
    private String urlToImage;
    private String content;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getUrlToImage() {
        return urlToImage;
    }

    public void setUrlToImage(String urlToImage) {
        this.urlToImage = urlToImage;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

Serializable(직렬화)를 implements(상속)받은 NewsData class를 만들어 getter, setter해준다.

 


Adapter

private List<NewsData> newsDataset;


public NewsAdapter(List<NewsData> myDataset){
        newsDataset = myDataset;
    }

NewsData는 List형식이므로 Adapter에서도 바꿔준다.

 


 

Activity

public void getNews() {

    String url = "https://newsapi.org/v2/top-headlines?country=kr&apiKey=28d52abfe26f4f0488faff173822d17c";

    StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    Log.d("News",response);

                    try {

                        JSONObject jsonObj = new JSONObject(response);
                        JSONArray arrayArticles = jsonObj.getJSONArray("articles"); // articles라는 이름의 배열을 가져오기

                        //response -> NewsData에 분류
                        List<NewsData> news = new ArrayList<>();

                        for(int i = 0, j = arrayArticles.length(); i < j; i++){
                           JSONObject obj =  arrayArticles.getJSONObject(i);

                            Log.d("News",obj.toString());

                            NewsData newsdata = new NewsData();
                            newsdata.setTitle( obj.getString("title"));
                            newsdata.setUrlToImage( obj.getString("urlToImage"));
                            newsdata.setContent(obj.getString("content"));

                            news.add(newsdata);
                        }

                        adapter = new NewsAdapter(news);
                        recyclerview.setAdapter(adapter);

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {

        }
    });

    // Add the request to the RequestQueue.
    queue.add(stringRequest);

}

 

getNews함수에 예외처리 에러가 발생해 try catch문으로 감싸주고

List형식으로 바꿨다

newsdata에서 필요한 부분만 set해서 가져온다

 

 

 

E/Volley: [797] BasicNetwork.performRequest: Unexpected response code 403 for

이라는 에러가 발생하는데 

 

 

new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        Log.d("error","error!!!!!!!");
    }
}){
    @Override
    public Map getHeaders() throws AuthFailureError{
        Map params = new HashMap();
        params.put("User-Agent", "Mozilla/5.0");

        return params;
    }

ErrorListener 안에 다음과 같이 작성하면 오류가 안나고 Log에서 News들이 잘 찍힌다...

 

 

반응형