마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

[극초보] 로그인 구현중에 서버연결에서 에러가 납니다.

0 추천
package com.logintest.okhttp_test;


import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;

import androidx.appcompat.app.AppCompatActivity;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;

public class LoginActivity extends AppCompatActivity {

    private static final String TAG="LoginActivity";

    EditText id, pw;
    String email, passwd;

    private LoginTask loginTask=LoginTask.getInstance();  //LoginTask에서 선언한 인스탠스 함수 불러옴.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        sendData();
        Log.d("send data", "success");
    }

    public void LoginBtnClick(View view) {

        email=id.getText().toString();
        passwd=pw.getText().toString(); //사용자가 입력한 값 문자열로 받아옴.

    }


    private void sendData() {
        new Thread() {
            public void run() {
                loginTask.requestWebServer("email", "passwd", callback);
            }
        }.start();
        Log.d("data", "success");
    }


    private final Callback callback=new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            Log.d("callback", "fail");
        }

        @Override
        public void onResponse(Call call, final Response response) {

            final EditText id=(EditText) findViewById(R.id.id);
            final EditText pw=(EditText) findViewById(R.id.pw);

            Button Login=(Button) findViewById(R.id.Login);

            Login.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String email=id.getText().toString();
                    String passwd=pw.getText().toString();

                        try {
                            JSONObject jsonObject=new JSONObject(String.valueOf(response));

                            boolean success=jsonObject.getBoolean("success");
                            if (success) {//로그인 성공시

                                email=jsonObject.getString("email");
                                passwd=jsonObject.getString("passwd");

                                Toast.makeText(getApplicationContext(), ("로그인에 성공하였습니다."), Toast.LENGTH_SHORT).show();
                                Intent intent=new Intent(LoginActivity.this, ResultActivity.class);

                                intent.putExtra("email", email);
                                intent.putExtra("passwd", passwd);

                                startActivity(intent);

                                Log.d("login", "success");

                            } else {//로그인 실패시
                                Toast.makeText(getApplicationContext(), "로그인에 실패하셨습니다.", Toast.LENGTH_SHORT).show();

                                Log.d("login", "fail");

                                return;
                            }

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }

            });

            Log.d("callback", "success");

        }
    };


}

 

 

 

package com.logintest.okhttp_test;

import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;

public class LoginTask {

    OkHttpClient client = new OkHttpClient();

    MediaType mediaType=MediaType.parse("application/x-www-form-urlencoded");

    private static LoginTask instance = new LoginTask();

    public static LoginTask getInstance() {
        return instance;
    }

    private LoginTask(){
        this.client = new OkHttpClient();
    }


    public void requestWebServer(String email, String passwd, Callback callback) {
            RequestBody body=new FormBody.Builder()
                    .add("email", email)
                    .add("passwd", passwd)
                    .build();

            Request request=new Request.Builder()
                    .url("https://도메인/api/v1/auth/test/login")
                    .addHeader("Content-Type", "application/x-www-form-urlencoded")
                    .post(body)
                    .method("POST", body)
                    .build();

            client.newCall(request).enqueue(callback);
        }


}

 

이제 막 안드로이드 개발에 발을 담그기 시작한 정말 극 초보입니다..

로그인 기능을 구현하려고 합니다. LoginActivity에서 에러가 나는데 저 에러가 무엇을 의미하는지 모르겠습니다ㅜㅜ JSONObject에 문제가 있는 것 같은데 어떻게 에러를 해결해야 하는지 감이 안잡힙니다.. 그리고 제 코드가 전체적으로 말이 되는 코드인지도 모르겠습니다. 전체적으로 코드도 한번 봐주시면 감사하겠습니다..

 

 

 

2020-10-07 11:22:41.227 29704-29704/com.logintest.okhttp_test W/System.err: org.json.JSONException: Value Response of type java.lang.String cannot be converted to JSONObject
2020-10-07 11:22:41.228 29704-29704/com.logintest.okhttp_test W/System.err:     at org.json.JSON.typeMismatch(JSON.java:111)
2020-10-07 11:22:41.228 29704-29704/com.logintest.okhttp_test W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:163)
2020-10-07 11:22:41.228 29704-29704/com.logintest.okhttp_test W/System.err:     at org.json.JSONObject.<init>(JSONObject.java:176)
2020-10-07 11:22:41.228 29704-29704/com.logintest.okhttp_test W/System.err:     at com.logintest.okhttp_test.LoginActivity$2$1.onClick(LoginActivity.java:79)
2020-10-07 11:22:41.229 29704-29704/com.logintest.okhttp_test W/System.err:     at android.view.View.performClick(View.java:6897)
2020-10-07 11:22:41.229 29704-29704/com.logintest.okhttp_test W/System.err:     at android.widget.TextView.performClick(TextView.java:12693)
2020-10-07 11:22:41.229 29704-29704/com.logintest.okhttp_test W/System.err:     at android.view.View$PerformClick.run(View.java:26103)
2020-10-07 11:22:41.230 29704-29704/com.logintest.okhttp_test W/System.err:     at android.os.Handler.handleCallback(Handler.java:789)
2020-10-07 11:22:41.230 29704-29704/com.logintest.okhttp_test W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:98)
2020-10-07 11:22:41.230 29704-29704/com.logintest.okhttp_test W/System.err:     at android.os.Looper.loop(Looper.java:164)
2020-10-07 11:22:41.230 29704-29704/com.logintest.okhttp_test W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6944)
2020-10-07 11:22:41.230 29704-29704/com.logintest.okhttp_test W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
2020-10-07 11:22:41.231 29704-29704/com.logintest.okhttp_test W/System.err:     at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
2020-10-07 11:22:41.231 29704-29704/com.logintest.okhttp_test W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

 

왕왕왕초보_final (120 포인트) 님이 2020년 10월 6일 질문
왕왕왕초보_final님이 2020년 10월 7일 수정

3개의 답변

0 추천

org.json.JSONException: Value Response of type java.lang.String cannot be converted to JSONObject

이거대로 구글링해서 찾아보세요

꿀개 (2,440 포인트) 님이 2020년 10월 8일 답변
0 추천

왜 Retrofit을 안쓰시고 굳이 OkHttp3로 직접 로직을 구현하시는 지는 모르겠지만, form url encoded를 통해 넘기는 request body의 타입이 JSON타입이 아니라서 그런 것 같네요.

RequestBody body = new FormBody.Builder()
                    .add("email", email)
                    .add("passwd", passwd)
                    .build();

String JsonFormatRequestBody = convertToJsonRequestBody(body)

Gson이나 Moshi같은 JSON serializer를 이용하여 body를 JSON Object으로 변환해 보세요.

spark (224,800 포인트) 님이 2020년 10월 13일 답변
0 추천
에러에 명확하게 타입 미스매치라고 적혀있고, 그 타입은 String이 아니라 int나 다른것인거 같습니다.
쭈쭈총각 (17,750 포인트) 님이 2020년 10월 14일 답변
...