Итак, я использую Android Studio 1.2.1.1, oKhttp 2.5.0, okio 1.6.0, я правильно установил зависимости (я полагаю), и я повсюду выглядел так, я должен делать что-то очень простое неправильно, поскольку никто другой, похоже, не имеет проблемы с этим.Параметры, которые не отправляются с использованием OkHTTP для Android Studio
У меня есть класс Java под названием OkHttpPostHandler со следующим кодом
import android.os.AsyncTask;
import com.squareup.okhttp.FormEncodingBuilder;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;
import java.io.IOException;
public class OkHttpPostHandler extends AsyncTask<String, Void, String> {
OkHttpClient client = new OkHttpClient();
String varUser, varPass;
public OkHttpPostHandler(String varUser, String varPass) {
this.varUser = varUser;
this.varPass = varPass;
}
@Override
protected String doInBackground(String... params){
RequestBody formBody = new FormEncodingBuilder()
.add("u", varUser)
.add("p", varPass)
.build();
Request request = new Request.Builder()
.url(params[0]).post(formBody)
.build();
try {
android.util.Log.w("Test", formBody.toString());
Response response = client.newCall(request).execute();
if (!response.isSuccessful())
throw new IOException("unexpected code " + response.toString());
return response.body().string();
} catch (Exception e) {
}
return null;
}
}
И у меня есть кнопка, которая считывает два вида EditText, чтобы получить имя пользователя и пароль, который затем выстреливает HTTP-вызов:
@Override
public void onClick(View bnLoginSubmit) {
EditText loginUsernameFont = (EditText) findViewById(R.id.evUsername);
EditText loginPasswordFont = (EditText) findViewById(R.id.evPassword);
String varUsername = loginUsernameFont.getEditableText().toString();
String varPassword = loginPasswordFont.getEditableText().toString();
String varPasswordHash = BCrypt.hashpw(varPassword, BCrypt.gensalt());
if (varUsername.isEmpty() || varPassword.isEmpty() || varUsername.contentEquals("") || varPassword.contentEquals("")) {
Toast.makeText(getApplicationContext(), "Username and/or Password Cannot be Empty",
Toast.LENGTH_LONG).show();
} else {
// sendPostRequest(varUsername, varPasswordHash);
boolean varPassCheck = BCrypt.checkpw("Password", varPasswordHash);
OkHttpPostHandler handler = new OkHttpPostHandler("Username_String","Password_String");
String result = null;
try {
result = handler.execute("http://www.example.com").get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
Toast.makeText(getApplicationContext(), "PHP Response = " + result,
Toast.LENGTH_LONG).show();
}
}
Я предположил, что проблема связана с моим хэшированием bcrypt (поэтому я использую вручную введенные строки для тестирования), но это, похоже, работает красиво. Просто мои параметры не проходят. Если я буду вводить параметры вручную в URL-адрес, он вернется правильно, но я предпочел бы иметь возможность построить этот класс, чтобы он мог быть динамичным для будущих вызовов.
Может ли кто-нибудь увидеть, что я делаю неправильно? Это должно быть что-то простое. Любая помощь будет оценена, поскольку я изо всех сил пытаюсь определить проблему.
Ваш бэкенд ждет запроса POST? Не могли бы вы выставить свой внутренний код? –
Вот очищенная версия, используя только строки Php $ username = $ _GET ['u']; $ password = $ _GET ['p']; if ($ username == 'Username_String' && $ password == 'Password_String') { echo 'true'; } else { echo 'username ='. $ username. 'Пароль ='. $ Пароль; } ?> – AranDG
Итак ... есть ваша проблема. В вашем бэкенде вы ожидаете запроса GET: '$ _GET' попытайтесь изменить на $ _POST ... (я думаю, что это в PHP) –