我正在编写Android应用的登录表单机制。登录活动将连接到数据库并验证最终用户提供的用户和密码是否确实存在于数据库中。
我是通过调用名为" login"的服务器端方法来实现的。服务器的终点是: example.us.es:3456/login / (机构网址)。
尝试使用java.net库提供的URL类来构建此URL时出现问题。我是这样做的,但肯定有问题:
public static final String ENDPOINT_LOGIN = "example.us.es:3456/login/"
URL url = new URL(ENDPOINT_LOGIN);
我不知道如何形成此URL,因为它包含端口号。在Android开发人员网页中,他们建议将URL格式化为:
http://username:password@host:8080/directory/file?query#ref
但我的网址与那个地址甚至不相似。
调试我的代码后,我得到的错误是:
java.net.MalformedURLException:找不到协议:example.us.es:3456/login /
以防万一有用,我登录活动的代码如下所示:
package com.example.loginapp;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.method.PasswordTransformationMethod;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
public class LoginActivity extends Activity {
EditText mUser;
EditText mPassword;
Button mLoginButton;
public static final String TAG = LoginActivity.class.getSimpleName();
public static final String ENDPOINT_LOGIN = "example.us.es:3456/login/"
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_macceso);
mUser = (EditText) findViewById(R.id.et_user);
mPassword = (EditText)findViewById(R.id.et_password);
mLoginButton = (Button)findViewById(R.id.b_signIn);
mLoginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FetchLoginInfo fetchLogin = new FetchLoginInfo();
fetchLogin.execute();
}
});
}
private void tryLogin(String username, String password)
{
HttpURLConnection connection = null;
OutputStreamWriter request = null;
BufferedReader reader = null;
URL url = null;
String response = null;
String parameters = "user="+username+"&password="+password;
try
{
url = new URL(ENDPOINT_LOGIN);
connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestMethod("POST");
request = new OutputStreamWriter(connection.getOutputStream());
request.write(parameters);
request.flush();
request.close();
String line = "";
InputStreamReader isr = new InputStreamReader(connection.getInputStream());
reader = new BufferedReader(isr);
StringBuilder sb = new StringBuilder();
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
// Respuesta del servidor se almacena en "response".
response = sb.toString();
isr.close();
reader.close();
} catch(IOException e) {
// Error
Log.e(TAG, "Error ", e);
} finally {
if (connection != null) {
connection.disconnect();
}
if (reader != null) {
try {
reader.close();
} catch (final IOException e) {
Log.e(TAG, "Error closing stream", e);
}
}
}
}
private class FetchLoginInfo extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
tryLogin(mUser.getText().toString(), mPassword.getText().toString());
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
//Check returned code from server
Intent i = new Intent(MAccesoActivity.this, MCentralActivity.class);
startActivity(i);
super.onPostExecute(aVoid);
}
}
}
我想在更正URL地址之后仍然会在tryLogin方法中出现其他错误,所以我将它附在上面,以防任何一个灵魂想要快速查看它以寻找任何大错误。
那么,如何构建我已经给出的URL?感谢。
java.net.ConnectException:连接失败 example.us.es/xxx.xxx.xxx.xx(端口3456):连接失败:ECONNREFUSED (连接被拒绝)
也许有人可以告诉我如何摆脱它。 (我不是服务器管理员;我应该联系她吗?)
最终错误:
联系管理员后,java.net.ConnectException:连接失败 example.us.es/xxx.xxx.xxx.xx(端口3456):连接失败:ECONNREFUSED (连接被拒绝)
已消失。所有问题都解决了。
答案 0 :(得分:2)
查看此异常消息,我注意到您忘记将http协议放在URL的开头。
祝你好运。