Android - 基于表单的身份验证

时间:2012-05-31 18:39:37

标签: android android-layout android-intent android-emulator android-ndk

我需要使用POST请求在网站上传一些数据。我知道要使用HTTP客户端execute a POST request

问题是,为了做到这一点,你应该先验证。
该站点是一个简单的页面,提示输入用户名和密码。我假设它在浏览器中存储了一个cookie并检查后续请求,看看我是否已经过身份验证 但我没有具体的想法如何在Android上实现这一点。

客户刚给了我这个:
要上传的网址:http://xyz.com/?page=add
凭据:admin / admin
数据格式:

$_POST = {
  ["Name"]=>string(255)
  ["Address"]=>string(255)
  ["ZIP"]=>string(50)
  ["City"]=>string(100)
  ["Phone"]=>string(50)
  ["Email"]=>string(50)
  ["Age"]=>int(11)
  ["Validation_Result"]=>string(255)
  ["Comment"]=>string(-)
}
$_FILES["Image"] = {
    ["name"]=>string "3D-graphics_3D_Triangles_006790_.jpg"
    ["type"]=>string "image/jpeg"
    ["tmp_name"]=>string "C:\Windows\Temp\php1362.tmp"
    ["error"]=>int(0)
    ["size"]=>int
}

没有别的。

请你指出我正确的方向如何做到这一点?

3 个答案:

答案 0 :(得分:1)

How to do HTTP authentication in android?

查看此问题的最佳答案。很好的解释。

答案 1 :(得分:0)

如果您使用HttpClient作为所链接的帖子进行POST,则可以通过执行以下操作添加基本身份验证:

String username, password;
DefaultHttpClient client = new DefaultHttpClient();

UsernamePasswordCredentials creds = new UsernamePasswordCredentials(username, password);
client.getCredentialsProvider().setCredentials(AuthScope.ANY, creds);

HTH

答案 2 :(得分:0)

我知道这是一个非常古老的问题,但这是我一直遇到的顶级搜索结果,我想添加另一种方法,我设法使用CookieStore和HttpClient。

对于我的用例(Tomcat服务器配置),我正在访问我的基本身份验证URL以获取cookie,将我的身份验证数据发布到表单提交端点,然后使用cookie进行后续调用。这是使它适合我的简化代码:

String cookieUrl = "SOME_URL_THAT_WILL_PROVIDE_COOKIE";
String authenticateUrl = "URL_TO_POST_FORM_DATA";
String dataUrl = "AUTHENTICATED_URL_YOU_WANT_DATA_FROM";

final String userNameKey = "FORM_KEY_FOR_USERNAME";
final String userPassKey = "FORM_KEY_FOR_PASSWORD";
final String userName = "USER_NAME";
final String userPass = "USER_PASSWORD";

HttpClient client = new DefaultHttpClient();
CookieStore cookieStore = new BasicCookieStore();
HttpContext context = new BasicHttpContext();
context.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

String getUrl = cookieUrl;
HttpGet get = new HttpGet( getUrl );
HttpResponse getResponse = client.execute(get, context);
Log.d( "ConnectionTest", "GET @ " + getUrl );
Log.d( "ConnectionTest", getResponse.getStatusLine().toString() );

List<NameValuePair> authDataList = new ArrayList<NameValuePair>();
authDataList.add( new NameValuePair() {
    @Override
    public String getName() {
        return userNameKey;
    }

    @Override
    public String getValue() {
        return userName;
    }
} );
authDataList.add( new NameValuePair() {
    @Override
    public String getName() {
        return userPassKey;
    }

    @Override
    public String getValue() {
        return userPass;
    }
} );
HttpEntity authEntity = new UrlEncodedFormEntity( authDataList );

String authPostUrl = authenticateUrl;
HttpPost authPost = new HttpPost( authPostUrl );
authPost.setEntity( authEntity );
HttpResponse authPostResponse = client.execute(authPost, context);
Log.d( "ConnectionTest", "POST @ " + authPostUrl );
Log.d( "ConnectionTest", authPostResponse.getStatusLine().toString() );

String getUsersUrl = dataUrl;
HttpGet usersGet = new HttpGet( getUsersUrl );
HttpResponse usersGetResponse = client.execute(usersGet, context);
Log.d( "ConnectionTest", "GET @ " + getUsersUrl );
Log.d( "ConnectionTest", usersGetResponse.getStatusLine().toString() );
Log.d( "ConnectionTest", EntityUtils.toString( usersGetResponse.getEntity() ) );