Android和REST服务调用-代码审查

时间:2018-12-29 21:50:46

标签: android rest spring-boot

我问过类似的问题,但答案并没有帮助我。我正在尝试从我的Android应用程序调用休息服务。其余服务看起来像这样:

process.env['PATH'] = process.env['PATH'] + ':/tmp/:' + process.env['LAMBDA_TASK_ROOT'];
var options = { phantomPath: '/tmp/phantomjs' };

require('child_process').exec(
    'cp /var/task/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs /tmp/.; chmod 755 /tmp/phantomjs;',
    function (error, stdout, stderr) {
        if (error) {
            //handle error
            console.log(error);
        } else {
            pdf.create(html, options).toBuffer(function (err, buffer) {
                if (err) return console.log(err);

                const s3PutParams = {
                    Bucket: 'my-bucket',
                    Key: Date.now().toString() + '.pdf',
                    Body: buffer,
                    ContentType: 'application/pdf',
                };

                s3.putObject(s3PutParams, function (error, data) {
                    if (error) {
                        console.error('s3:putObject failed!');
                        callback(error);
                        return;
                    }

                    callback(null, {statusCode: 200, body: JSON.stringify('Success')});
                });
            });
        }
    }
);

我启动我的REST服务,然后尝试从我的android应用中调用它,如下所示:

@RestController
@RequestMapping("/login")
public class LoginController {
@ResponseBody
@RequestMapping(value = "/user", method = RequestMethod.GET)
public boolean getUser(@RequestParam(value = "name", required = true) String  userName, @RequestParam(value = "password", required = true) String password) {
        if (userName.equals("MMM") && password.equals("mmm")) {
            return true;
        } else {
            return false;
        }
    }
}

我收到的状态码为0。 当我使用API​​测试REST服务时,就可以了。我没有任何错误。我在同一网络上,并且防火墙已关闭。

2 个答案:

答案 0 :(得分:0)

要了解问题所在,您需要使用onFailure方法调查“错误”对象

 @Override
    public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
        Log.i("ws", "---->>onFailure : " + error);
    }
    });

建议:

1)不要在GET中发送密码!

密码不得包含在网址中,请使用POST并在请求正文中发送密码

2)您的android代码看起来不错,但是它存在一个本机框架来调用名为“ VOLLEY”的REST服务。 排球有以下好处:

  • 自动调度网络请求。
  • 多个并发网络连接。
  • 具有标准HTTP缓存一致性的透明磁盘和内存响应缓存。
  • 对请求优先级的支持。
  • 取消请求API。您可以取消单个请求,也可以将请求的阻止或范围设置为取消。
  • 易于定制,例如重试和退避。
  • 强大的排序功能使您可以轻松地使用从网络异步获取的数据正确填充UI。
  • 调试和跟踪工具。

代码并不比您的复杂...

示例:

String url = "http://my-json-feed";

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest
        (Request.Method.GET, url, null, new Response.Listener<JSONObject>() {

    @Override
    public void onResponse(JSONObject response) {
        mTextView.setText("Response: " + response.toString());
    }
}, new Response.ErrorListener() {

    @Override
    public void onErrorResponse(VolleyError error) {
        // TODO: Handle error

    }
});

https://developer.android.com/training/volley/

答案 1 :(得分:0)

我可以看到您在这里做了一些“坏习惯”。

问题1

我可以看到您的Spring Controller想要使用用户名和密码作为URL参数。这不是服务器可能会记录URL /端点请求,该请求现在将以纯文本形式包含您的凭据。

修复选项

  1. 非常常见->通过HTTPS使用授权标头(最常见:请参见基本身份验证)。
  2. 不常见->在POST正文中传递用户名和密码。

问题2

未按预期使用框架

我建议使用Spring Security。从长远来看,它将使您的东西更加安全,值得您去做。它将为您处理身份验证,角色和密码哈希。