我想创建一个Android应用程序,这个应用程序将对Web服务进行RESTful调用以获取一些数据。
我知道RESTful接口会是什么,但我不想要创建自己的实现的麻烦。有没有一种简单的方法来创建一个存根RESTful Web服务,它将返回一些静态数据而无需编写完整的WS应用程序来执行此操作?
答案 0 :(得分:14)
Mocky.io允许您创建存根端点并指定它们通过公共URL返回的数据。
Runscope(免责声明,我是创始人)允许您捕获一次真实请求,然后根据需要通过Response Playback网址重播回复。
答案 1 :(得分:9)
如果您想测试实际的HTTP调用代码,我发现使用Sinatra对这类事情非常有用。您可以让端点在几秒钟内返回数据。需要很少的Ruby知识。
require 'sinatra'
require 'json'
get '/Person' do
content_type :json
{ :id => 345, :key2 => 'John Doe' }.to_json
end
您是否需要返回一个简单的json对象。
答案 2 :(得分:5)
其中一种方法(类似于Vinnie)是在本地实现您的Web服务。例如,您的Web服务允许您在线登录用户并获取用户列表。
webservice界面如下所示:
public interface WebService {
public LoginResponse login(String user, String pass) throws Exception;
public UsersOnlineResponse getOnlineUsers() throws Exception;
}
然后,我们为将在生产中使用的远程webservice实现此接口。远程实现在HTTP客户端的帮助下进行HTTP调用,检索响应并将其解析为适当的响应对象。这是它的一个片段:
public class RemoteWebService implements WebService {
private AndroidHttpClient client = AndroidHttpClient.newInstance(USER_AGENT);
@Override
public LoginResponse login(String user, String pass) throws Exception {
LoginResponse response = client.execute(
createPostRequest(METHOD_LOGIN, user, pass),
new JsonResponseHandler(LoginResponse.class));
handleResponse(response); // verify response, throw exceptions if needed
return response;
}
}
出于测试目的,当webservice不可用或正在开发时,我们实现本地Web服务。本地实现从assets文件夹获取预定义的JSON响应,并将其解析为适当的响应对象。由您决定如何实现Web服务行为:它可以是简单的静态响应或一些随机/验证相关的响应。这是它的一部分:
public class LocalWebService implements WebService {
private Context context;
public LocalWebService(Context context) {
this.context = context;
}
@Override
public LoginResponse login(String user, String pass) throws Exception {
Thread.sleep(DELAY); //emulate network delay
if (validateParams(user, pass)) {
return parseAssetsJson("ws/login.json", LoginResponse.class);
} else {
Response response = parseAssetsJson("ws/status_bad_request.json", Response.class);
throw new WebServiceException(response);
}
}
public <T> T parseAssetsJson(String filename, Class<T> klass) throws IOException {
InputStream is = context.getAssets().open(filename);
return JsonParser.getInstance().fromJson(new InputStreamReader(is), klass);
}
}
接下来,我们希望无痛地在实现之间切换。 webservice的两种实现的使用都是透明的,因为我们使用WebService接口。因此,我们将在应用程序启动时配置WebService实例。 Application课程符合我们的需求:
public class App extends Application {
public static final boolean USE_LOCAL_WS = false;
private static WebService webService;
public static getWebService() {
return webService;
}
@Override
public void onCreate() {
super.onCreate();
webService = USE_LOCAL_WS ? new LocalWebService(this) : new RemoteWebService();
}
}
答案 3 :(得分:3)
我建议查看WireMock(免责声明 - 我写的): http://wiremock.org/
您可以在笔记本电脑上独立运行它,配置存根响应并验证您的应用是否发送了您期望的请求。
可以通过流畅的Java API或JSON(文件或HTTP)进行配置。
答案 4 :(得分:1)
我最终为类似的目的编写了一个模拟服务工具:https://github.com/clafonta/Mockey/wiki
模拟服务是一个很好的工具,可以快速构建UI并验证您的客户端代码,但它可能会变成一个兔子洞,所以我建议您在构建自己的之前使用已经存在的东西。当你搜索'mock'时,Github有很多结果。无论你做什么,这里都有一些你可能会遇到的关键障碍。
您最终使用了错误的数据/ JSON格式。例如,您的应用可以很好地使用模拟服务,但在点击真实服务时会中断,因为您的应用会使用JSON对象但实际服务返回一个JSON对象数组。为避免这种情况,您可以尝试使用JSON Schema来帮助突出显示模拟服务中的无效JSON模型。
您的应用无法发出有效请求。您的模拟服务通常不关心传入的请求。例如,真实服务需要“customerID”,您的应用程序永远不会将其传入。为避免这种情况,您可以在模拟服务中构建一些“必需的请求参数”验证逻辑。
测试挑战。如果您想要测试超出简单“快乐路径”的内容,您的自动化功能测试方法需要与模拟服务工具进行交互。例如,您运行测试“用户A登录并看到0条消息”与“用户B登录并看到20条消息”。
答案 5 :(得分:1)
您可以尝试Jadler(http://jadler.net)。这是一个我已经工作了一段时间的http存根/模拟库。它应该满足我的所有要求。
答案 6 :(得分:1)
Beeceptor(免责声明,我是作者)会在这里为您提供确切的用例。创建API端点,定义模拟路径和响应。在黑客马拉松中使用它可以在几秒钟内构建模拟API。
Beeceptor不仅仅是一种模拟服务。它是API的HTTP代理。例如,如果您有真正的API,请使用真实API作为最终目标。 Beecetor拦截交通并使用规则,
使用Mocky.io,您将拥有不同的API路径,使用Beeceptor,您的基本URL将始终相同。
答案 7 :(得分:0)
可能最好的办法是在开发应用程序代码时为REST Web服务服务创建一个模拟,然后用代码替换它,以便在您的应用程序编写完成后调用实际的Web服务返回“真实”数据
我正在编写一个非常类似的应用程序,您(像您一样)从RESTful Web应用程序获取数据。在我的应用程序中,我遵循GWT推荐的MVP模式,并且Martin Fowler也将其记录为PassiveView模式。
您要做的是抽象出代码以使REST Web服务调用到接口(模型)中。此模型类的职责是向演示者/控制器提供数据。 Presenter将处理您的所有业务逻辑,然后将数据传递到视图(视图应该非常愚蠢,以及它也可以被模拟)。在测试期间,您将创建一个MockModel来实现模型接口并将测试数据传递给Presenter - 而根本不进行实际的Web服务调用!然后,当您准备好后,您将使用实际的Web服务替换此类并开始集成测试。
这种方法的另一个好处是,在模拟模型中创建特定(和可重复)的测试用例很容易。如果您无法控制实际的Web服务(我假设您没有),这可能很难(甚至不可能)实现。结果应该是一个更健壮,更好测试的应用程序,无需自己创建任何测试XML或JSON或创建Web服务。
答案 8 :(得分:0)
使用虚拟响应创建一些文件并放入文件夹。现在转到命令行并执行以下命令: python -m SimpleHTTPServer
您现在可以访问这些文件和虚拟回复了 HTTP://:8000
答案 9 :(得分:0)
我建议看看FakeRest(https://github.com/marmelab/FakeRest),这是一个仅使用XMLHTTPRequest猴子修补的客户端假冒服务器。
免责声明:我写了它。
答案 10 :(得分:0)
Atmo可能有用。
免责声明:我是atmo的作者。
答案 11 :(得分:0)
以防有人仍然在year >= 2017
查看此帖子。现在有免费的工具,让您在几秒钟内创建模拟肥皂和休息网络服务,而无需在您的盒子上安装或部署任何东西。
您可以选择您的http方法,响应代码,响应消息正文,内容类型,指定自定义端点等。
将远程网络服务的模拟数据返回给您的应用,任何类型的应用都非常有用。
免责声明,我开发此服务是出于必要,我将其免费,以便其他人可以从解决方案中受益。
答案 12 :(得分:0)
有一个名为 QuickMocker 的全新模拟 API 解决方案,它不仅允许对静态数据进行存根处理,还允许使用短代码生成假(伪造)、随机和上下文数据。支持多种 HTTP 方法和 RegExp URL 路径,允许创建甚至一个可以拦截任何您需要的虚拟端点。是的,它允许调试对您的虚假 API 域发出的任何请求。
答案 13 :(得分:-1)
您可以使用http://maqueapp.com/来创建模拟Web服务。它快速简便。我在theflexshow episode 157(不是flexshow!)
上听说过