简体   繁体   English

Android 应用程序进行 JSON 调用从服务器获取意外数据,但相同的调用在浏览器中有效

[英]Android app making JSON call gets unexpected data from server, but same call works in browser

I have an Android app that makes a server call which returns JSON.我有一个 Android 应用程序,它发出一个返回 JSON 的服务器调用。

The server code returns the right string if I enter the URL into a browser.如果我在浏览器中输入 URL,服务器代码将返回正确的字符串。 But it creates exceptions in the Java app (different issues with http and https server calls).但它会在 Java 应用程序中创建异常(http 和 https 服务器调用存在不同的问题)。

https://www.problemio.com/auth/mobile_login.php?login=test.name@gmail.com&password=130989

Returns this string:返回此字符串:

[{"user_id":"1601470","email":"test.name@gmail.com","first_name":"TestName","last_name":null}]

And this is the Java call that parses the JSON but gives an Exception:这是解析 JSON 但给出异常的 Java 调用:

@Override
protected void onPostExecute(String result) 
{

    try {
        dialog.dismiss();
    } catch (Exception ee) {
        // nothing
    }           

    if ( connectionError == true )
    {
        Toast.makeText(getApplicationContext(), "Please try again. Possible Internet connection error.", Toast.LENGTH_LONG).show();  
    }           

    if ( result != null && result.equals( "no_such_user") )
    {
        Toast.makeText(getApplicationContext(), "Your email and password do not match out records. Please try again or create and account.", Toast.LENGTH_LONG).show(); 

        //final TextView login_error = (TextView) findViewById(R.id.login_error);
    }
    else
    {
        Log.d( "CONNECTION*** ERRORS: " , "ok 3 and result length: " + result.length()  );

        String firstName = null;
        String lastName = null;
        String email = null;
        String user_id = null;

        try
        {
            JSONArray obj = new JSONArray(result);
            JSONObject o = obj.getJSONObject(0);
            firstName = o.getString("first_name");
            lastName = o.getString("last_name");
            email = o.getString("email");
            user_id = o.getString("user_id");
        }
        catch ( Exception e )
        {
            Log.d( "JSON ERRORS: " , "something happened ****" + e.getMessage() );
        }


        // 1) First, write to whatever local session file that the person is logged in
        // - I just really need user id and name and email. And store that.
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences( 
                LoginActivity.this);

        if ( user_id != null && user_id.trim().length() > 0 && !user_id.trim().equals("null") )
        {
            prefs.edit()
            .putString("first_name", firstName)
            .putString("last_name", lastName)
            .putString("email", email)              
            .putString("user_id", user_id)
            .putBoolean("working", true)
            .commit();

            if ( user_id.equals("1"))
            {
                prefs.edit()
                .putString("community_subscription", "1")
                .commit();
            }
        }
    }
}    
}

And this is the exception message:这是异常消息:

End of input at character 0 of

It just looks like the string is 0 characters long.看起来字符串的长度为 0 个字符。

Any idea why this is happening?知道为什么会这样吗? Before I switched my site to https this call used to work without problems.在我将我的站点切换到 https 之前,这个调用过去可以正常工作。

Also the server makes an http call.服务器还会进行 http 调用。 If I change it to https it returns a whole bunch of HTML which is weird since I don't actually send that back.如果我将其更改为 https 它会返回一大堆 HTML ,这很奇怪,因为我实际上并没有将其发回。

This is my doInBackground method:这是我的 doInBackground 方法:

@Override
protected String doInBackground(String... theParams) 
{
    String myUrl = theParams[0];
    final String myEmail = theParams[1];
    final String myPassword = theParams[2];

    String charset = "UTF-8";           

    Authenticator.setDefault(new Authenticator()
    {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() 
        {
            return new PasswordAuthentication( myEmail, myPassword.toCharArray());
        }
    }); 

Edit编辑

If my doInBackground method is inside the如果我的 doInBackground 方法在

public class DownloadWebPageTask extends AsyncTask<String, Void, String>   

Can it be that the server is just too slow to return the string and that is why it is getting null?是不是服务器返回字符串太慢了,这就是为什么它得到 null?

It is always crashing on this with the result string being empty:它总是崩溃,结果字符串为空:

JSONArray obj = new JSONArray(result);

Edit 2编辑 2

Here is the full code:这是完整的代码:

package com.problemio;

import java.io.InputStream;
import java.net.Authenticator;
import java.net.HttpURLConnection;
import java.net.PasswordAuthentication;
import java.net.URL;
import java.net.URLEncoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import java.io.InputStreamReader;
import java.io.BufferedReader;

import org.json.JSONArray;
import org.json.JSONObject;

import com.flurry.android.FlurryAgent;

import utils.SendEmail;

import android.app.Dialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class LoginActivity extends BaseActivity 
{
    //private TextView textView;
    private Dialog dialog;

    public static final String REQUEST_METHOD = "GET";
    public static final int READ_TIMEOUT = 15000;
    public static final int CONNECTION_TIMEOUT = 15000;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        FlurryAgent.onStartSession(this, "8CA5LTZ5M73EG8R35SXG");

        setContentView(R.layout.login);        

        //final TextView emailask = (TextView) findViewById(R.id.email_ask);

        // Show form for login_email
        final EditText loginEmail = (EditText) findViewById(R.id.login_email);  
        //String name = loginEmail.getText().toString();

        // Show field for password  
        final EditText password = (EditText) findViewById(R.id.password);
        //String text = password.getText().toString();
        //Log.d( "First parameters: " , "Login email: " + loginEmail + " AND login password: " +  text);


        // Show button for submit
        Button submit = (Button)findViewById(R.id.submit);   

        submit.setOnClickListener(new Button.OnClickListener() 
        {  
           public void onClick(View v) 
           {
              String email = loginEmail.getText().toString();
              String pass = password.getText().toString();

               //Set the email pattern string
//            Pattern pattern = Pattern.compile(".+@.+\\.[a-z]+");
//            //Match the given string with the pattern
//            Matcher m = pattern.matcher(email);
//            //check whether match is found
//            boolean matchFound = m.matches();               

              // TODO: VALIDATE!!!
              if ( email == null || email.trim().length() < 2 )
              {
                  Toast.makeText(getApplicationContext(), "Please enter a valid email address.", Toast.LENGTH_LONG).show();                       
              }
              else
              if ( pass == null || pass.trim().length() < 2 )
              {
                  Toast.makeText(getApplicationContext(), "Please enter a correct password.", Toast.LENGTH_LONG).show();                          
              }
              else
              {
                 sendFeedback(pass, email); 
              }  
           }
        });        

        // Show button for submit
        Button forgot_password = (Button)findViewById(R.id.forgot_password);   

        forgot_password.setOnClickListener(new Button.OnClickListener() 
        {  
           public void onClick(View v) 
           {
              Toast.makeText(getApplicationContext(), "Please wait...", Toast.LENGTH_LONG).show();  

              Intent intent = new Intent(LoginActivity.this, ForgotPasswordActivity.class);
              LoginActivity.this.startActivity(intent);           
           }
        });                

        // Now add messaging for creating a profile
        final TextView create_profile_message = (TextView) findViewById(R.id.create_profile_message);

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

        create_profile.setOnClickListener(new Button.OnClickListener() 
        {  
           public void onClick(View v) 
           {
                //sendEmail("Create Profile Clicked", "From Login screen, someone clicked on the create profile button" );   

                Intent myIntent = new Intent(LoginActivity.this, CreateProfileActivity.class);
                LoginActivity.this.startActivity(myIntent);
           }
        });        

    }

    public void sendFeedback(String pass , String email) 
    {  
        String[] params = new String[] { "http://www.problemio.com/auth/mobile_login.php", email, pass };

        DownloadWebPageTask task = new DownloadWebPageTask();
        task.execute(params);        
    }          

    // Subject , body
    public void sendEmail( String subject , String body )
    {
        String[] params = new String[] { "http://www.problemio.com/problems/send_email_mobile.php", subject, body };

        SendEmail task = new SendEmail();
        task.execute(params);               
    }

    public class DownloadWebPageTask extends AsyncTask<String, Void, String> 
    {
         private boolean connectionError = false;

         @Override
         protected void onPreExecute( ) 
         {
              dialog = new Dialog(LoginActivity.this);

              dialog.setContentView(R.layout.please_wait);
                dialog.setTitle("Logging You In");

              TextView text = (TextView) dialog.findViewById(R.id.please_wait_text);
                text.setText("Please wait while you are being logged in...");
              dialog.show();
         }

         // orig
        @Override
        protected String doInBackground(String... theParams)
        {
            String myUrl = theParams[0];
            final String myEmail = theParams[1];
            final String myPassword = theParams[2];

            String charset = "UTF-8";

            Authenticator.setDefault(new Authenticator()
            {
                @Override
                protected PasswordAuthentication getPasswordAuthentication()
                {
                    return new PasswordAuthentication( myEmail, myPassword.toCharArray());
                }
            });

            String response = null;

            String stringUrl = "https://www.problemio.com/auth/mobile_login.php?login=test.name@gmail.com&password=130989";
            String result = "";
            String inputLine;

            try
            {
                String query = String.format("login=%s&password=%s",
                         URLEncoder.encode(myEmail, charset),
                         URLEncoder.encode(myPassword, charset));

                final URL url = new URL( myUrl + "?" + query );

                final HttpURLConnection conn = (HttpURLConnection) url.openConnection();

                conn.setDoOutput(true);
                conn.setRequestMethod("POST");

                conn.setRequestProperty("login", myEmail);
                conn.setRequestProperty("password", myPassword);
                conn.setDoOutput(true);

                conn.setUseCaches(false);

                conn.connect();

                final InputStream is = conn.getInputStream();
                final byte[] buffer = new byte[8196];
                int readCount;
                final StringBuilder builder = new StringBuilder();
                while ((readCount = is.read(buffer)) > -1)
                {
                    builder.append(new String(buffer, 0, readCount));
                }

                response = builder.toString();

            }
            catch (Exception e)
            {
                  sendEmail ( "Login Activity 1 Network Error" , "Error: " + e.getMessage() );
            }

            return response;
        }



        @Override
        protected void onPostExecute(String result) 
        {
            super.onPostExecute(result);

            try {
                dialog.dismiss();
            } catch (Exception ee) {
                // nothing
            }           

            if ( connectionError == true )
            {
                Toast.makeText(getApplicationContext(), "Please try again. Possible Internet connection error.", Toast.LENGTH_LONG).show();  
            }           

            if ( result != null && result.equals( "no_such_user") )
            {
                Toast.makeText(getApplicationContext(), "Your email and password do not match out records. Please try again or create and account.", Toast.LENGTH_LONG).show(); 

                //final TextView login_error = (TextView) findViewById(R.id.login_error);
            }
            else
            {

                String firstName = null;
                String lastName = null;
                String email = null;
                String user_id = null;

                try
                {
                    JSONArray obj = new JSONArray(result);
                    Log.d( "CONNECTION*** ERRORS: " , ".....5"  );
                    JSONObject o = obj.getJSONObject(0);
                    firstName = o.getString("first_name");
                    lastName = o.getString("last_name");
                    email = o.getString("email");
                    user_id = o.getString("user_id");

                }
                catch ( Exception e )
                {
                    Log.d( "JSON ERRORS: " , "some crap happened ****" + e.getMessage() );
                }


                // 1) First, write to whatever local session file that the person is logged in
                // - I just really need user id and name and email. And store that.
                SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences( 
                        LoginActivity.this);

                if ( user_id != null && user_id.trim().length() > 0 && !user_id.trim().equals("null") )
                {
                    prefs.edit()
                    .putString("first_name", firstName)
                    .putString("last_name", lastName)
                    .putString("email", email)              
                    .putString("user_id", user_id)
                    .putBoolean("working", true)
                    .commit();

                    if ( user_id.equals("1"))
                    {
                        prefs.edit()
                        .putString("community_subscription", "1")
                        .commit();
                    }
                }
            }
        }    
    }

    // TODO: see if I can get rid of this
    public void readWebpage(View view) 
    {
        DownloadWebPageTask task = new DownloadWebPageTask();
        task.execute(new String[] { "http://www.problemio.com/auth/mobile_login.php" });
    }       

    @Override
    public void onStop()
    {
       super.onStop();
    }       
}

ISSUE #1问题 #1

From your question description:根据您的问题描述:

The server code returns the right string if I enter the URL into a browser.如果我在浏览器中输入 URL,服务器代码将返回正确的字符串。

I'm assuming you are using HTTP GET .我假设您正在使用HTTP GET However you are using HTTP POST in your code instead:但是,您在代码中使用HTTP POST代替:

String query = String.format("login=%s&password=%s",
                         URLEncoder.encode(myEmail, charset),
                         URLEncoder.encode(myPassword, charset));

                final URL url = new URL( myUrl + "?" + query );

                final HttpURLConnection conn = (HttpURLConnection) url.openConnection();

                conn.setDoOutput(true);
                conn.setRequestMethod("POST"); // <----------- replace with "GET"

ISSUE #2问题 #2

 conn.setDoOutput(true); 

When set to true the request method is changed to POST , since GET or DELETE can't have a request body.当设置为 true 时,请求方法更改为POST ,因为GETDELETE不能有请求正文。 To continue with a GET request you must set conn.setDoOutput(false);要继续GET请求,您必须设置conn.setDoOutput(false);

Also, comment out those lines:另外,注释掉这些行:

//conn.setRequestProperty("login", myEmail);
//conn.setRequestProperty("password", myPassword);
//conn.setDoOutput(true);

ISSUE #3问题 #3

 task.execute(new String[] { "http://www.problemio.com/auth/mobile_login.php" });

From Android 8: Cleartext HTTP traffic not permitted来自 Android 8:不允许明文 HTTP 流量

You must change the URL from http to https or add android:usesCleartextTraffic="true" in the manifest. You must change the URL from http to https or add android:usesCleartextTraffic="true" in the manifest. This will only effect on devices running API level 23+.这只会影响运行 API 级别 23+ 的设备。 Before 23+ http is allowed by default. 23+之前http默认是允许的。

<?xml version="1.0" encoding="utf-8"?>
<manifest ...>
    <uses-permission android:name="android.permission.INTERNET" />
    <application
        ...
        android:usesCleartextTraffic="true"
        ...>
        ...
    </application>
</manifest>

For me using https worked properly.对我来说,使用https工作正常。

ISSUE #4问题 #4

Upon providing wrong credentials your server is sending a plain text message提供错误凭据后,您的服务器正在发送纯文本消息

no_such_user没有这样的用户

Which needs to be replaced with a valid JSON string.需要用有效的 JSON 字符串替换。

From my end, the code you provided is working properly after fixing those issues.从我的角度来看,您提供的代码在解决这些问题后可以正常工作。

I tried your code using HttpURLConnection in async task, It gave me the desired output without error.. But if I give different password in the get url.. the response is not JSONObject.我在异步任务中使用 HttpURLConnection 尝试了您的代码,它给了我所需的 output 而没有错误。但是如果我在获取 url 中给出不同的密码 .. 响应不是 JSONObject。 It is coming as String value.它以字符串值的形式出现。 may be that causing the issue(u handle that also in postexecute method)可能是导致问题的原因(您也在 postexecute 方法中处理)

public class HttpGetRequest extends AsyncTask<String, Void, String> {
    public static final String REQUEST_METHOD = "GET";
    public static final int READ_TIMEOUT = 15000;
    public static final int CONNECTION_TIMEOUT = 15000;

    @Override
    protected String doInBackground(String... params) {
        String stringUrl = "https://www.problemio.com/auth/mobile_login.php?login=test.name@gmail.com&password=130989";
        String result = "";
        String inputLine;
        try {
            //Create a URL object holding our url
            URL myUrl = new URL(stringUrl);
            //Create a connection
            HttpURLConnection connection = (HttpURLConnection)
                    myUrl.openConnection();
            //Set methods and timeouts
            connection.setRequestMethod(REQUEST_METHOD);
            connection.setReadTimeout(READ_TIMEOUT);
            connection.setConnectTimeout(CONNECTION_TIMEOUT);

            //Connect to our url
            connection.connect();
            //Create a new InputStreamReader
            InputStreamReader streamReader = new
                    InputStreamReader(connection.getInputStream());
            //Create a new buffered reader and String Builder
            BufferedReader reader = new BufferedReader(streamReader);
            StringBuilder stringBuilder = new StringBuilder();
            //Check if the line we are reading is not null
            while ((inputLine = reader.readLine()) != null) {
                stringBuilder.append(inputLine);
            }
            //Close our InputStream and Buffered reader
            reader.close();
            streamReader.close();
            //Set our result equal to our stringBuilder
            result = stringBuilder.toString();
        } catch (Exception e) {

        }
        return result;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
       // textView.setText("Response is: " + response);
        try {
            JSONArray obj = new JSONArray(result);
            JSONObject o = obj.getJSONObject(0);
            String firstName = o.getString("first_name");
            String lastName = o.getString("last_name");
            String email = o.getString("email");
            String user_id = o.getString("user_id");
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

Looking your Json I can see a null看着你的 Json 我可以看到 null

[
  {
    "user_id": "1601470",
    "email": "test.name@gmail.com",
    "first_name": "TestName",
    "last_name": null
  }
]

Json files accept nulls, but json objects do not accept it. Json 文件接受空值,但 json 对象不接受它。

The application is crashing when you try to get the last_name .当您尝试获取last_name时,应用程序正在崩溃。

Instead of null use empty.而不是 null 使用空。

[
  {
    "user_id": "1601470",
    "email": "test.name@gmail.com",
    "first_name": "TestName",
    "last_name": ""
  }
]

Regards问候

If calling the API using the HTTP protocol has no problem and changing the protocol to HTTPS makes the issue, it points to the trust management problem.如果使用HTTP协议调用 API 没有问题,将协议更改为HTTPS出现问题,则表明信任管理问题。 I guess the certificate of the service provider (problemio.com) is not known by the device.我猜设备不知道服务提供商(problemio.com)的证书。

As you're not publishing the doInBackground() method, I guess that you're returning an empty String when an exception is thrown.由于您没有发布doInBackground()方法,我猜您在抛出异常时返回了一个空String However, with supposing that and you're using HttpURLConnection , I propose the below code to trust all SSL sockets.但是,假设您使用的是HttpURLConnection ,我建议使用以下代码来信任所有SSL sockets。 (Note that it may be harmful on untrusted networks!) (请注意,它可能对不受信任的网络有害!)

Call the trust method with passing your HttpURLConnection as its argument, before calling the connect() .在调用connect()之前,通过传递您的HttpURLConnection作为其参数来调用trust方法。

import java.net.HttpURLConnection;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class YourClass {

    // Other class members...

    public void trust(HttpURLConnection connection) throws NoSuchAlgorithmException, KeyManagementException {
        if (connection instanceof HttpsURLConnection) {
            X509TrustManager trustManager = new X509TrustManager() {

                @Override
                public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {
                }

                @Override
                public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {
                }

                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    return new X509Certificate[0];
                }
            };

            // Install the all-trusting trust manager
            SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(null, new TrustManager[]{trustManager}, new SecureRandom());

            // Create an ssl socket factory with our all-trusting manager
            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            HttpsURLConnection httpsConnection = (HttpsURLConnection) connection;
            httpsConnection.setSSLSocketFactory(sslSocketFactory);
            httpsConnection.setHostnameVerifier((s, sslSession) -> true);
        }
    }

    // Other class members...

}

As per google this is old technique Retrieve API data using AsyncTask, I prefer Retrofit + RxJava + RxAndroid + GSON.根据谷歌,这是使用 AsyncTask 检索 API 数据的旧技术,我更喜欢 Retrofit + RxJava + RxAndroid + GSON。

It will remove all your boilerplate code.它将删除您所有的样板代码。 It is so easy to use Retrofit.使用 Retrofit 就是这么简单。

Add Below dependency in your app,在您的应用程序中添加以下依赖项,

//retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.6.1'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.11.0'
    implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
    implementation 'com.squareup.retrofit2:converter-scalars:2.3.0'
//Rx android
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
    implementation 'io.reactivex.rxjava2:rxjava:2.2.8'

Create MyRetrofit class,创建 MyRetrofit class,

import com.google.gson.GsonBuilder;
import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;

import java.util.concurrent.TimeUnit;

import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class MyRetrofit {
    private static Retrofit retrofit = null;


    public static Retrofit getInstance() {
        String BASE_URL = "https://www.problemio.com/";
        if (retrofit == null) {
            OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
            httpClient.readTimeout(60, TimeUnit.MINUTES);
            httpClient.connectTimeout(60, TimeUnit.SECONDS);

            if (BuildConfig.DEBUG) {
                HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
                logging.setLevel(HttpLoggingInterceptor.Level.BODY);

                httpClient.addInterceptor(logging);
            }
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create(new GsonBuilder().setLenient().create()))
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .client(httpClient.build())
                    .build();

        }
        return retrofit;
    }
}

Create APIService Class,创建 APIService Class,

    import in.kintanpatel.customrecylerview.model.LoginBean;
    import io.reactivex.Observable;
    import retrofit2.Response;
    import retrofit2.http.GET;
    import retrofit2.http.Query;

    /**
     * Created by kintan on 8/11/18.
     */

    public interface APIService {
//Add All your method here

        @GET("auth/mobile_login.php/")
        Observable<Response<ArrayList<LoginBean>>> doLogin(@Query("login") String login, @Query("password") String password);

    }

That's it now call your API stuff here,就是这样,现在在这里调用你的 API 的东西,

private void doLoginAPI(String userName, String password) {
        //Show Loading here
        MyRetrofit.getInstance().create(APIService.class).doLogin(userName, password)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Response<ArrayList<LoginBean>>>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(Response<ArrayList<LoginBean>> response) {
                        //Hide Loading here
                        if (response.isSuccessful()) { //check HTTP Response
                            LoginBean bean = response.body().get(0);
                            Log.e("USER_INFO", "User ID: " + bean.getUserId());
                            Log.e("USER_INFO", "User First Name : " + bean.getFirstName());
                            Log.e("USER_INFO", "User Last Name : " + bean.getLastName());
                            Log.e("USER_INFO", "User Email : " + bean.getEmail());

                        }
                    }
                    @Override
                    public void onError(Throwable e) {
                        Log.e("USER_INFO", e.getMessage());
                    }

                    @Override
                    public void onComplete() {

                    }
                });

    }

And just call your method where you want:只需在您想要的地方调用您的方法:

 doLoginAPI("test.name@gmail.com", "130989");

And Your output like,和你的 output 一样,

11-08 14:44:59.946 25447-25447/com.kintanpatel.baserecyclerview E/USER_INFO: User ID: 1601470
11-08 14:44:59.946 25447-25447/com.kintanpatel.baserecyclerview E/USER_INFO: User First Name : TestName
11-08 14:44:59.946 25447-25447/com.kintanpatel.baserecyclerview E/USER_INFO: User Last Name : null
11-08 14:44:59.946 25447-25447/com.kintanpatel.baserecyclerview E/USER_INFO: User Email : test.name@gmail.com

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM