android/java在项目中组织http web服务调用的结构/模式是啥?

Posted

技术标签:

【中文标题】android/java在项目中组织http web服务调用的结构/模式是啥?【英文标题】:What is the structure/pattern for android/java to organise http web service calls in the project?android/java在项目中组织http web服务调用的结构/模式是什么? 【发布时间】:2012-10-28 20:02:36 【问题描述】:

现在只要我的项目在后端有网络服务。我习惯用这种结构/模式来创建我的项目。

项目

HttpMethods 包 HttpGetThread HttpPostThread HttpMultipartPostThread 接口包 IPostResponse

我在这些 JAVA 文件中编写的代码是,

IPostResponse.java

public interface IPostResponse 
    public void getResponse(String response);

HttpGetThread.java

public class HttpGetThread extends Thread 

    private String url;
    private final int HTTP_OK = 200;
    private IPostResponse ipostObj;

    public HttpGetThread(String url, IPostResponse ipostObj) 
        this.url = url;
        this.ipostObj = ipostObj;
    

    public void run() 
        try 
            HttpClient httpClient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);
            HttpResponse httpResponse = httpClient.execute(httpGet);
            int responseCode = httpResponse.getStatusLine().getStatusCode();
            if (responseCode == HTTP_OK) 
                InputStream inputStream = httpResponse.getEntity().getContent();
                int bufferCount = 0;
                StringBuffer buffer = new StringBuffer();
                while ((bufferCount = inputStream.read()) != -1) 
                    buffer.append((char) bufferCount);
                
                ipostObj.getResponse(buffer.toString());
            
         catch (ClientProtocolException e) 
            e.printStackTrace();
         catch (IOException e) 
            e.printStackTrace();
        
    

HttpPostHttpMultipartPost 类中的方法相同,方法是扩展 Thread 并具有一个构造函数和一个 run 方法。

那么,

我实现了一个活动的接口,并将该主要活动扩展到所有其他活动,并通过创建带有参数的 Http 类的对象并调用 obj.start(); 来获得响应和调用。


我仍然认为:我缺少很多东西或者这个结构很差。

我需要知道,对于一个 android 应用程序来说,要在大多数活动中实现 Web 服务调用并具有代码可重用性我应该遵循哪种模式/结构

我刚刚看到 Facebook 如何进行网络服务调用,例如登录/注销它有登录和注销侦听器。

是否有任何博客/文章/答案有据可查?请问,任何用户都可以分享他/她的出色经验和解决方案吗?

我更感兴趣的是“我的类和接口应该是什么样子,应该有哪些方法?

【问题讨论】:

@CloseVoters ***.com/faq#questions 如果你试图理解这个问题不是这样的问题之一:“我用 ______ 代表 ______,你用什么?” .. 这是关于如何以全局和可重用的方式解决问题,成为最强大和最完美的解决方案。 我已经提出了我对类似问题here 的处理方法。那个问题是关于 RESTful 客户端的——但概念是一样的。 谢谢,很快就会仔细看看。 【参考方案1】:

第一个也是大多数建议是你为什么不使用Painless Threading 即AsyncTask

现在第二件事是创建一个可重复使用的代码,如下所示,您可以创建尽可能多的带有请求参数的方法。

public class JSONUtil 

    private static JSONUtil inst;

    private JSONUtil() 

    

    public static JSONUtil getInstance() 
        if (inst == null)
            inst = new JSONUtil();
        return inst;
    

    /**
     * Request JSON based web service to get response
     * 
     * @param url
     *            - base URL
     * @param request
     *            - JSON request
     * @return response
     * @throws ClientProtocolException
     * @throws IOException
     * @throws IllegalStateException
     * @throws JSONException
     */
    public HttpResponse request(String url, JSONObject request)
            throws ClientProtocolException, IOException, IllegalStateException,
            JSONException 

        synchronized (inst) 

            DefaultHttpClient client = new DefaultHttpClient();
            HttpPost post = new HttpPost(url);
            post.setEntity(new StringEntity(request.toString(), "utf-8"));
            HttpResponse response = client.execute(post);
            return response;
        
    

    public HttpResponse request(String url)
            throws ClientProtocolException, IOException, IllegalStateException,
            JSONException 

        synchronized (inst) 

            DefaultHttpClient client = new DefaultHttpClient();             
            HttpPost post = new HttpPost(url);
            post.addHeader("Cache-Control", "no-cache");
            HttpResponse response = client.execute(post);
            return response;
        
    

【讨论】:

谢谢你的建议,我一定会实现的,现在我的主要问题是“我的类和接口应该是什么样子,它应该有什么样的方法?”【参考方案2】:

我知道这是一个老问题,但我仍然想回答它以分享我在自己的项目中所做的事情,并且我会喜欢社区对我的方法提出的建议。

HttpClient

如果你看一下 HttpClient(作为向端点发出请求的实体),它就是关于请求和响应的。这样想。Http 协议“发送请求”的行为需要方法、headers(可选)、body(可选)。同样,在返回请求时,我们会得到带有状态码、标头和正文的响应。因此,您可以简单地将 HttpClient 设置为:

public class HttpClient 

    ExecutorService executor = Executors.newFixedThreadPool(5);
     //method below is just prototype 
     public String execute(String method, String url, Map < String, String > headers ) 
     
          try 
          
           URL url = new URL("http://www.javatpoint.com/java-tutorial");
           HttpURLConnection huc = (HttpURLConnection) url.openConnection();
           //code to write headers, body if any
           huc.disconnect();
           //return data
           
          catch (Exception e) 
          
           System.out.println(e);
          
     

       public String executeAsync(String method, String url, Map < String, String > headers, Callback callback ) 
     //Callback is Interface having onResult()
         executor.execute(
             new Runnable()
             
                 void run()
                 
                    String json= execute(method,url,headers)
                    callback.onResult(json);
                 
             
          );
     

这样您就不需要为单独的请求创建一个类。相反,我们将只使用HtttpClient。您必须在其他线程上调用 API(而不是在 Android 的主线程上)。

API 结构

假设您有名为 User 的资源,并且您的应用中需要 CRUD。您可以创建接口 UserRepository 和实现 UserRepositoryImpl

interface UserRepository

    void get(int userId, Callback callback);

    void add(String json,Callback callback);

    //other methods



class UserRepositoryImp

    void get(int userId, Callback callback)
    
        HttpClient httpClient= new HttpClient();
        //create headers map
        httpClient.executeAsync("GET","/",authHeaders,callback);
    

    void add(String json,Callback callback)
    
         HttpClient httpClient= new HttpClient();
        //create headers map
        httpClient.executeAsync("POST","/",authHeaders,callback);
    

    //other methods

请注意,您应该在 Android 的 UI 线程上更新 UI。[上面的实现不用担心]

【讨论】:

以上是关于android/java在项目中组织http web服务调用的结构/模式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

第一个android项目构建错误

vue第三方ui使用

如何发布java web项目,需要做啥配置?

Maven中的“找不到符号”错误

四月八号日报

ruby 来自http://robots.thoughtbot.com/how-we-test-rails-applications