NutzCN Logo
问答 有没有人遇到过403的问题呀,访问nutzbook的工程没有问题,另外一个非nutz的工程返回403
发布于 2566天前 作者 shusheng 1656 次浏览 复制 上一个帖子 下一个帖子
标签:
Request req = Request.create("http://localhost:8080/test/", Request.METHOD.POST);
//        Request req = Request.create("http://localhost:8085/xiao/qq", Request.METHOD.GET);
        req.getParams().put("xxx", "aa");
        Response resp = Sender.create(req).setTimeout(6000).send();
        if (!resp.isOK()) {
            // .......
            System.out.println(resp.getStatus());
        } else {
            // ....
            System.out.println(resp.getStatus());
        }

test是nutzbook工程,xiao是小薇机器人工程,两个工程都启动了,也都可以用postman访问,用Java代码调用接口时小薇机器人的工程时返回了403,有没有人遇到类似问题,帮回答一下

13 回复

"小薇机器人"拦截了机器人访问吧, 例如判断headers里面的User-Agent

req.getHeader().set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36")

用了这个API就可以接收数据了

HttpResponse<JsonNode> jsonResponse = Unirest.post("http://localhost:8085/xiao/qq")
                .header("accept", "application/json")//Content-Type:application/x-www-form-urlencoded
                .header("Content-Type", "application/x-www-form-urlencoded")
                .queryString("key", "123456")
                .queryString("msg", "abcdefjhigklmn")
                .field("parameter", "value")
                .field("foo", "bar")
                .field("aaa", "aaaaaa")
                .asJson();
        System.out.println(jsonResponse.getStatus()+"--"+jsonResponse.getBody());

代码

Request req = Request.create("http://localhost:8085/xiao/qq", Request.METHOD.POST);
        req.getHeader().set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36");
        req.getParams().put("xxx", "aa");
        Response resp = Sender.create(req).setTimeout(6000).send();
        if (!resp.isOK()) {
            // .......
            System.out.println(resp.getStatus());
        } else {
            // ....
            System.out.println(resp.getStatus());
        }

结果:

2017-4-10 19:28:3.275 INFO [main] Select SystemLog as Nutz.Log implement
403

Process finished with exit code 0

@wendal 这个确实不知道什么原因哦

那就把Content-Type和Accept 也配上, 首字母要大写

呵呵,试过了,不行的
@wendal

既然这样,那就把所有header就加上

另外, 为啥 Unirest 的测试代码里面, key和msg是放在queryString内, 而其他参数是放在field呢?? 在nutz.http的代码里面是全部放在param(等价于field)了

因为在Unirest 中,放在queryString中,相当于跟在URL后面,而field相当于在body中,小薇服务器上的代码request.getParameter("key")只能获得URL后面的参数,不能获得body中的参数

@RequestProcessing(value = "/qq", method = HTTPRequestMethod.POST)
    public void qq(final HTTPRequestContext context,
            final HttpServletRequest request, final HttpServletResponse response) throws Exception {
        final String key = XiaoVs.getString("qq.bot.key");
        String ss = request.getParameter("key");

body中的参数可以这么获得:

BufferedReader br = new BufferedReader(new InputStreamReader((ServletInputStream) request.getInputStream(), "utf-8"));
        StringBuffer sb = new StringBuffer("");
        String temp;
        while ((temp = br.readLine()) != null) {
            sb.append(temp);
        }
        br.close();
        String dd = sb.toString();
        LOGGER.info("qq|body="+dd);

@wendal

所以就是这个原因咯, 需要把key放在url里

可是还没有走到我的业务代码就返回403了,应该是没有通过服务器验证,就是不知道少了header还是什么
@wendal

你的业务代码指的是啥

req.getParams().put("xxx", "aa");就是说这个没有放到URL中,所以没有收到了,重新改一下就可以了

Request req = Request.create("http://localhost:8085/xiao/qq?key=123456?msg=abcd", Request.METHOD.POST);
        req.getParams().put("xxx", "aa");
        Response resp = Sender.create(req).setTimeout(6000).send();
        if (!resp.isOK()) {
            // .......
            System.out.println(resp.getStatus());
        } else {
            // ....
            System.out.println(resp.getStatus());
        }

终于解决了,多谢
@wendal

手一抖,写错了,呵呵,改一下

Request req = Request.create("http://localhost:8085/xiao/qq?key=123456&msg=abcd", Request.METHOD.POST);
        req.getParams().put("xxx", "aa");
        Response resp = Sender.create(req).setTimeout(6000).send();
        if (!resp.isOK()) {
            // .......
            System.out.println(resp.getStatus());
        } else {
            // ....
            System.out.println(resp.getStatus());
        }
添加回复
请先登陆
回到顶部