Android - 形成指定端口号的URL对象

时间:2015-08-01 17:15:58

标签: java android url httpurlconnection

我正在编写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?感谢。

更新(1)

正如Rodrigo Henriques所指出的那样,我忘了添加&#34; http&#34; URL开头的方案。虽然这解决了问题(java.net.MalformedURLException),现在我得到一个新的:

  

java.net.ConnectException:连接失败   example.us.es/xxx.xxx.xxx.xx(端口3456):连接失败:ECONNREFUSED   (连接被拒绝)

也许有人可以告诉我如何摆脱它。 (我不是服务器管理员;我应该联系她吗?)

更新(2)

最终错误:

  

java.net.ConnectException:连接失败   example.us.es/xxx.xxx.xxx.xx(端口3456):连接失败:ECONNREFUSED   (连接被拒绝)

联系管理员后,

已消失。所有问题都解决了。

1 个答案:

答案 0 :(得分:2)

查看此异常消息,我注意到您忘记将http协议放在URL的开头。

祝你好运。