6.2.1 使用说明

将框架目录下的 ./SDK/JAVA/net 目录中的全部代码拷贝到项目里面即可使用。如:

[6.2] SDK包(JAVA版) - 图1

6.2.2 代码示例

如下是使用的代码场景片段。

首先,我们需要导入SDK包:

  1. //FullscreenActivity.java
  2. import net.phalapi.sdk.*;

然后,准备一个子线程调用,并在此线程中实现接口请求:

  1. /**
  2. * 网络操作相关的子线程
  3. */
  4. Runnable networkTask = new Runnable() {
  5. @Override
  6. public void run() {
  7. // TODO
  8. // 在这里进行 http request.网络请求相关操作
  9. PhalApiClient client = PhalApiClient.create()
  10. .withHost("http://demo.phalapi.net/");
  11. PhalApiClientResponse response = client
  12. .withService("Default.Index")
  13. .withParams("username", "dogstar")
  14. .withTimeout(3000)
  15. .request();
  16. String content = "";
  17. content += "ret=" + response.getRet() + "\n";
  18. if (response.getRet() == 200) {
  19. try {
  20. JSONObject data = new JSONObject(response.getData());
  21. content += "data.title=" + data.getString("title") + "\n";
  22. content += "data.content=" + data.getString("content") + "\n";
  23. content += "data.version=" + data.getString("version") + "\n";
  24. } catch (JSONException ex) {
  25. }
  26. }
  27. content += "msg=" + response.getMsg() + "\n";
  28. Log.v("[PhalApiClientResponse]", content);
  29. Message msg = new Message();
  30. Bundle data = new Bundle();
  31. data.putString("value", content);
  32. msg.setData(data);
  33. handler.sendMessage(msg);
  34. }
  35. };

接着,实现线程回调的hander:

  1. Handler handler = new Handler() {
  2. @Override
  3. public void handleMessage(Message msg) {
  4. super.handleMessage(msg);
  5. Bundle data = msg.getData();
  6. String val = data.getString("value");
  7. Log.i("mylog", "请求结果为-->" + val);
  8. // TODO
  9. // UI界面的更新等相关操作
  10. }
  11. };

最后,在我们需要的地方启动:

  1. View.OnClickListener mDummyBtnClickListener = new View.OnClickListener() {
  2. @Override
  3. public void onClick(View arg0) {
  4. // 开启一个子线程,进行网络操作,等待有返回结果,使用handler通知UI
  5. new Thread(networkTask).start();
  6. // ....
  7. }
  8. };

再一次调用和异常请求

当我们需要再次使用同一个接口实例进行请求时,需要先进行重置,以便清空之前的接口参数,如:

  1. //再一次请求
  2. response = client.reset() //重置
  3. .withService("User.GetBaseInfo")
  4. .withParams("user_id", "1")
  5. .request();
  6. content = "";
  7. content += "ret=" + response.getRet() + "\n";
  8. if (response.getRet() == 200) {
  9. try {
  10. JSONObject data = new JSONObject(response.getData());
  11. JSONObject info = new JSONObject(data.getString("info"));
  12. content += "data.info.id=" + info.getString("id") + "\n";
  13. content += "data.info.name=" + info.getString("name") + "\n";
  14. content += "data.info.from=" + info.getString("from") + "\n";
  15. } catch (JSONException ex) {
  16. }
  17. }
  18. content += "msg=" + response.getMsg() + "\n";
  19. Log.v("[PhalApiClientResponse]", content);

异常情况下,即ret != 200时,将返回错误的信息,如:

  1. //再来试一下异常的请求
  2. response = client.reset()
  3. .withService("XXX.XXXX")
  4. .withParams("user_id", "1")
  5. .request();
  6. content = "";
  7. content += "ret=" + response.getRet() + "\n";
  8. content += "msg=" + response.getMsg() + "\n";
  9. Log.v("[PhalApiClientResponse]", content);

6.2.3 运行效果

运行后,查询log,可以看到:

[6.2] SDK包(JAVA版) - 图2

可以注意到,在调试模式时,会有接口请求的链接和返回的结果日记,如:

  1. 10-17 07:40:55.268: D/[PhalApiClient requestUrl](1376): http://demo.phalapi.net/?service=User.GetBaseInfo&user_id=1
  2. 10-17 07:40:55.364: D/[PhalApiClient apiResult](1376): {"ret":200,"data":{"code":0,"msg":"","info":{"id":"1","name":"dogstar","from":"oschina"}},"msg":""}

6.2.4 扩展你的过滤器和结果解析器

(1)扩展过滤器

当服务端接口需要接口签名验证,或者接口参数加密传送,或者压缩传送时,可以实现此过滤器,以便和服务端操持一致。

当需要扩展时,分两步。首先,需要实现过滤器接口:

  1. class MyFilter implements PhalApiClientFilter {
  2. public void filter(String service, Map<String, String> params) {
  3. //TODO ...
  4. }
  5. }

然后设置过滤器:

  1. PhalApiClientResponse response = PhalApiClient.create()
  2. .withHost("http://demo.phalapi.net/")
  3. .withFilter(new MyFilter())
  4. // ...
  5. .request();

(2)扩展结果解析器

当返回的接口结果不是JSON格式时,可以重新实现此接口。

当需要扩展时,同样分两步。类似过滤器扩展,这里不再赘述。

6.2.5 特别注意:Android之NetworkOnMainThreadException异常

由于此SDK包是使用HttpURLConnection发起请求时,所以在主线程调用时会触发NetworkOnMainThreadException异常,具体可参考: Android之NetworkOnMainThreadException异常

所以,需要使用子线程来发起请求,或者重新继承改用异步的请求。

还有疑问?欢迎到社区提问! 切换到PhalApi 2.x 开发文档。

原文: https://www.phalapi.net/wikis/6-2.html