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();
HttpPost
和 HttpMultipartPost
类中的方法相同,方法是扩展 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服务调用的结构/模式是啥?的主要内容,如果未能解决你的问题,请参考以下文章
ruby 来自http://robots.thoughtbot.com/how-we-test-rails-applications