2012-08-13 93 views
2

您好我正在教自己android开发。首先,我已经在android上使用apache http utils实现了一个web服务器,它在模拟器上浏览localhost:8080时提供登录页面。使用http组件解析http请求服务器端

我想知道如何解析android服务器端的登录请求。这个web服务器根据Uri请求提供内容。当提交登录页面时,表单发布到/ login。做,在localhost:8080

我已经注册了该动作的处理程序,如图below.I想知道如果有一种方法来解析请求主体在我的处理程序和服务html accordingly.I只有一个字段的形式来分析,即password 。我只能读取请求标题。

在正确的方向任何意见或指针将大大appreciated.Thanks

import java.io.BufferedInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 

import org.apache.http.HeaderElement; 
import org.apache.http.HeaderElementIterator; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpException; 
import org.apache.http.HttpRequest; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.entity.ContentProducer; 
import org.apache.http.entity.EntityTemplate; 
import org.apache.http.message.BasicHeaderElementIterator; 
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; 
    String req; 
    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; 

      OutputStreamWriter writer = new OutputStreamWriter(outstream, "UTF-8");  
      HeaderIterator it = request.headerIterator(); 
      while (it.hasNext()) 
      { 
       System.out.println(it.next()); 
      } 
       if (validateUser()==true) 
        resp = "<html><head></head><body><h1>Home<h1><p>Success."+req+"</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 validateUser(){ 
     boolean valid=false; 
     //if valid valid=true else valid=false 
     return valid; 
    } 



} 

输出如下:

08-15 15:54:22.112: I/Process(650): Sending signal. PID: 650 SIG: 9 
08-15 15:54:27.532: I/HTTPSERVICE(662): Creating and starting httpService 
08-15 15:54:27.542: I/Notification(662): Notification Shown 
08-15 16:08:19.332: I/HTTPSERVICE(662): Destroying httpService 
08-15 16:08:19.352: I/Notification(662): Notification Destroyed 
08-15 16:20:14.852: I/HTTPSERVICE(690): Creating and starting httpService 
08-15 16:20:14.862: I/Notification(690): Notification Shown 
08-15 16:20:28.102: D/dalvikvm(690): GC freed 2292 objects/135976 bytes in 157ms 
08-15 16:20:28.872: I/Resources(690): Loaded time zone names for en_US in 3090ms. 
08-15 16:20:28.882: I/global(690): Default buffer size used in BufferedReader constructor.  It would be better to be explicit if an 8k-char buffer is required. 
08-15 16:20:35.302: I/System.out(690): Host: localhost:8080 
08-15 16:20:35.382: I/System.out(690): Accept-Encoding: gzip 
08-15 16:20:35.422: I/System.out(690): Referer: http://localhost:8080/ 
08-15 16:20:35.422: I/System.out(690): Accept-Language: en-US 
08-15 16:20:35.442: I/System.out(690): User-Agent: Mozilla/5.0 (Linux; U; Android 2.1-update1; en-us; sdk Build/ECLAIR) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17 
08-15 16:20:35.472: I/System.out(690): Origin: http://localhost:8080 
08-15 16:20:35.512: I/System.out(690): Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 
08-15 16:20:35.533: I/System.out(690): Content-Type: application/x-www-form-urlencoded 
08-15 16:20:35.562: I/System.out(690): Accept-Charset: utf-8, iso-8859-1,utf-16,*;q=0.7 
08-15 16:20:35.599: I/System.out(690): Content-Length: 25 

我找不到任何适用的资源,我的情况下, apache site.Is可以直接从url读取requestbody?

回答

0

环顾四周后,我找到了解决方案。在句柄方法中添加以下内容会产生诀窍。感谢原始海报。 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(); 
    } 
    }