Разобрать входящий http пост запрос java android
Я работаю на веб-сервере Android. Когда я захожу на localhost:8080 в браузере эмулятора, он отображает страницу / форму с полем пароля. При успешной проверке пароля я хотел бы перенаправить пользователя на страницу успеха / неудачи. Каков наилучший способ прочитать входящий HTTP-пост-запрос и проанализировать поле пароля для проверки? Любые указатели в правильном направлении будут с благодарностью У меня есть обработчик для URL, на который отправляется форма. Код для обработчика:
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import org.apache.http.HttpEntity;
import org.apache.http.HttpException;
import org.apache.http.HttpRequest;
import org.apache.http.HttpResponse;
import org.apache.http.entity.ContentProducer;
import org.apache.http.entity.EntityTemplate;
import org.apache.http.protocol.HttpContext;
import org.apache.http.protocol.HttpRequestHandler;
import android.content.Context;
public class LoginHandler implements HttpRequestHandler {
private Context context = null;
public LoginHandler(Context context) {
this.context = context;
}
@Override
public void handle(final HttpRequest request, HttpResponse response,
HttpContext httpcontext) throws HttpException, IOException {
HttpEntity entity = new EntityTemplate(new ContentProducer() {
public void writeTo(final OutputStream outstream) throws IOException {
String resp = null;
OutputStreamWriter writer = new OutputStreamWriter(outstream, "UTF-8");
if(validatePassword()==true){
resp ="<html><head></head><body><h1>Home<h1><p>Success.</p></body></html>";
}
else{resp="<html><head></head><body><h1>Home<h1><p>Login Failed.</p></body></html>";}
writer.write(resp);
writer.flush();
}
});
response.setHeader("Content-Type", "text/html");
response.setEntity(entity);
}
boolean validatePassword(){
boolean pass=false;
//parse request body here and check for the password if true return true/else false
return pass;
}
}
2 ответа
Посмотрев вокруг целую вечность, я нашел решение. Добавление следующего в метод handle делает свое дело. Спасибо оригинальному постеру. http://www.androiddevblog.net/android/a-bare-minimum-web-server-for-android-platform
if (request instanceof HttpEntityEnclosingRequest) {
HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity();
if (entity != null) {
Log.v("RequestBody", EntityUtils.toString(entity, "UTF-8"));
entity.consumeContent();
}
}
Я прошу прощения, если это не совсем то, что вы спрашиваете, так что если это не так, дайте мне знать.
Вы можете использовать JSONObject, чтобы вернуть, был ли этот пароль проверен как правильный.
Например, если пароль правильный, вы можете сохранить результат HTTP как:
{"status":200,"confirmed":"true"}
Или "ложь" в противном случае.
Когда вы вернетесь из HTTP Post Request, вы можете сохранить этот результат в виде строки, а затем сделать JSONObject
из этого. Например:
// Send the URL to a postRequest function and return the result as a String
String output = makePostRequest(url);
// Parse the String as a JSONObject and receive whether or not the login was confirmed
JSONObject o = new JSONObject(output);
String confirmed = o.getString("confirmed");
if (confirmed.equals("true")) {
// Password confirmed - redirect user to success page
} else {
// Password incorrect - redirect user to failure page
}
Примечание: если вам нужно понять, как получить код ответа из запроса на публикацию, вот пример кода:
String output = {};
// Use bufferedreader and stringbuilder to build an output string (where conn is your HTTPUrlConnection object you used to make the post request
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
// Loop through response to build JSON String
while((line = br.readLine()) != null) {
sb.append(line + "\n");
}
// Set output from response
output = sb.toString();
И сейчас output
это строка, которую вы можете превратить в JSONObject.
Помогает ли что-нибудь из этого?
Редактировать:
Итак, строка, которую вы получите, будет в формате {"password":"somepassword"}
, Чтобы разобрать это, попробуйте это:
String s = /* the string in the format {"password":"somepassword"} */
JSONObject o = new JSONObject(s);
String password = o.getString("password");
if (password.equals(random_password_at_beginning_of_webservice) {
// Password confirmed - redirect user to success page
} else {
// Password incorrect - redirect user to failure page
}