【问题标题】:Twisted Java methods in Android code needs good eyeballsAndroid 代码中扭曲的 Java 方法需要良好的眼球
【发布时间】:2011-03-14 18:06:38
【问题描述】:

试图在 url 中将 vars 发送到服务器。 (脚本可以通过手动 url 找到)。变量被拾取并显示在日志中,但在我在这里显示的代码部分中,url 没有调用脚本: String urlString = SERVER + this.getString(R.string.login_details_url); (顺便说一句,在其他工作活动中调用的常量中,php 文件名拼写正确)。

我认为这可能是方法设置方式的问题。并且似乎有来自服务器的有效响应,这说明了最后激活的成功敬酒。这里缺少什么?

谢谢

private void acctinfo(String username, String email, String password, String usertype, String over35, String userid) {                      
    Log.d(DEBUG_TAG, "AcctInfo() entered:" +  username + email + password + usertype + over35 + userid); /// These vars show up in logs
    try
    {

        sendAcctInfoToServer(this, username, email, password, usertype, over35, userid);

    }
    catch(Exception e)
    {
        e.printStackTrace();
        Log.d(DEBUG_TAG, "sendAcctInfoToServer error " , e);
        Toast.makeText(mContext, "Failed to Subit New Info", Toast.LENGTH_SHORT).show();


    }
}


private void sendAcctInfoToServer(Context context, String username, String email, String password, String usertype, String over35, String userid) throws Exception

{


    // Create a new HttpClient and Post Header
    HttpClient httpclient = new DefaultHttpClient();
    String urlString = SERVER + this.getString(R.string.login_details_url);


    urlString = urlString + "?" + USEREMAIL_VAR + "=" + email;
    urlString = urlString + "&" + PASSWORD_VAR + "=" + password;
    urlString = urlString + "&" + USERNAME_VAR + "=" + username;  
    urlString = urlString + "&" + USERID_VAR + "=" + userid;        
    urlString = urlString + "&" + USERTYPE_VAR + "=" + usertype;
    urlString = urlString + "&" + OVER35_VAR + "=" + over35;        
    urlString =  urlString+ "&change_acct=1";
    HttpPost httppost = new HttpPost(urlString);        //////This url does not get sent
    HttpResponse response =httpclient.execute(httppost);


    // Check if server response is valid
    String result = null;
    StatusLine status = response.getStatusLine();
    Log.d(DEBUG_TAG, " AcctInfo response.getStatusLine() "  + status.getStatusCode());
    if (status.getStatusCode() != HttpURLConnection.HTTP_OK) {
        result = "Invalid response from server, status code=" + status.toString();
        // Failed - so throw 
        throw new Exception("Please try again" + result); //TODO external string, remove details of error
    }
    else {
        //toast
        Toast.makeText(mContext, getString(R.string.toast_acct_info_saved), Toast.LENGTH_SHORT).show(); /// this success toast appears but no vars, of course, are passed to script
        finish();
    }
}

【问题讨论】:

    标签: java android methods


    【解决方案1】:

    一定要接受 luc 的建议来构建 Uri,因为它会降低拼写或编码错误的可能性,因为这会让你把头撞到坚硬的物体上。我看到的问题更像是一个可能的问题,而不是一个明确的错误,并且可能是问题的根源,具体取决于远程服务器的设置方式。

    您正在创建一个HttpPost 对象,该对象使用设置为 POST 的 HTTP 动词发出请求。在这些情况下,您传递的参数通常会被编码到 POST 正文中,而不是 URL 本身中。当您在 URL 中传递参数时,请求通常是 GET 请求(在 Android 中使用 HttpGet 构建)。有可能,如果您的服务器需要 POST,它不会在 URL 中查找您的参数,如果它在 URL 中查找,则需要 GET。

    要将参数编码到 POST 正文中(如果需要),请执行以下操作:

    HttpClient client = new DefaultHttpClient();
    String urlString = SERVER + this.getString(R.string.login_details_url);
    HttpPost request = new HttpPost(urlString);
    
    List<NameValuePair> parameters = new ArrayList<NameValuePair>();
    parameters.add(new BasicNameValuePair(USEREMAIL_VAR,email));
    parameters.add(new BasicNameValuePair(PASSWORD_VAR,password));
    //...etc...
    request.setEntity(new UrlEncodedFormEntity(parameters));
    HttpResponse response = client.execute(request);
    

    希望有帮助!

    【讨论】:

    • 确实如此。谢谢。设法使用GETS将url发送到服务器,顺便说一句,但将重新编码为对值POSTS。
    【解决方案2】:

    尝试使用 android Uri 对象来构建您的 URL。

    String baseUrl = getResources().getString(R.string.login_details_url);
    Uri.Builder builder = Uri.parse(baseUrl).buildUpon()
        .appendQueryParameter(USEREMAIL_VAR, email)
        .append...;
    HttpPost httppost = new HttpPost(builder.build());
    HttpResponse response = httpclient.execute(httppost);
    

    也许你的问题是由于错误的字符编码。

    要记录响应,您可以从 response.getEntity().getContent() 创建一个 InputStreamReader
    我不知道哪个 min-sdk 版本使用您的应用程序,但是有一个 AndroidHttpClient 设置了很多默认值。我的请求使用 DefaultHttpClient 失败,但使用 AndroidHttpClient 成功。
    我不直接使用 AndroidHttpClient (API8),但我得到了代码(删除 curl 的部分)。 raw AndroidHttpClient sources
    注意你不能在主线程中使用AndroidHttpClient,你必须在一个新的AsyncTask或者一个runnable+thread中执行查询。

    【讨论】:

    • 感谢您的回复,卢克。有趣的是,我发布的同一部分代码在 Login.java 中“镜像”并且没有任何问题。为什么它在这个文件 AcctInfo.java 中不起作用很奇怪。想法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    相关资源
    最近更新 更多