我有一个Android应用,可以进行服务器调用并返回JSON。
如果我在浏览器中输入URL,服务器代码将返回正确的字符串。但这会在Java应用程序中创建异常(http和https服务器调用的不同问题)。
https://www.problemio.com/auth/mobile_login.php?login=test.name@gmail.com&password=130989
返回此字符串:
[{"user_id":"1601470","email":"test.name@gmail.com","first_name":"TestName","last_name":null}]
这是解析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();
}
}
}
}
}
这是异常消息:
End of input at character 0 of
它看起来像字符串是0个字符长。
知道为什么会这样吗?在我将网站切换到https之前,此调用一直可以正常工作。
服务器也进行http呼叫。如果我将其更改为https,则会返回一整堆HTML,这很奇怪,因为我实际上并未将其发送回去。
这是我的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());
}
});
编辑
如果我的doInBackground方法位于
内部public class DownloadWebPagetask extends AsyncTask<String,Void,String>
服务器是否太慢而无法返回字符串,这就是为什么它变为空的原因?
它总是崩溃,结果字符串为空:
JSONArray obj = new JSONArray(result);
编辑2
这是完整的代码:
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,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,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(),Toast.LENGTH_LONG).show();
}
if ( result != null && result.equals( "no_such_user") )
{
Toast.makeText(getapplicationContext(),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();
}
}