Скрученные Java-методы в коде Android нуждаются в хороших взглядах - PullRequest
0 голосов
/ 14 марта 2011

Попытка получить переменные, отправленные на сервер в URL. (Скрипт работает найти с ручным 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();
    }
}

Ответы [ 2 ]

1 голос
/ 14 марта 2011

Определенно примите предложение Люка для построения Uri, так как это приведет к снижению вероятности ошибок правописания или кодирования, которые заставят вас биться головой о твердые объекты.Я вижу что-то, что является более вероятной проблемой, чем конкретная ошибка, и может быть источником вашей проблемы в зависимости от того, как настроен удаленный сервер.

Вы создаете объект HttpPost, который делаетзапрос с HTTP-глаголом, установленным в POST.В этих случаях обычно передаваемые параметры кодируются в теле POST, а не в самом URL.Когда вы передаете параметры в URL, запрос, как правило, представляет собой запрос GET (созданный с использованием HttpGet в Android).Существует вероятность, что, если ваш сервер ожидает 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);

Надеюсь, что поможет!

0 голосов
/ 14 марта 2011

Попробуйте использовать объект 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);

Возможно, ваша проблема связана с неправильной кодировкой символов.

Для регистрации ответа вы можете создать InputStreamReader из ответа.getEntity (). getContent ()
Я не знаю, какая версия min-sdk использует ваше приложение, но есть AndroidHttpClient, который устанавливает множество значений по умолчанию.Мой запрос не удался с DefaultHttpClient, но успешно с AndroidHttpClient.
Я не использую непосредственно AndroidHttpClient (API8), но я получаю код (удаление частей для скручивания). сырые источники AndroidHttpClient
Будьте осторожны, вы не можете использовать AndroidHttpClient в главном потоке, вы должны выполнить запрос в новом AsyncTask или в выполняемом потоке +.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...