从邮递员那里获得OKHTTP的不同结果

时间:2016-03-11 07:57:20

标签: java android postman okhttp3

我正在尝试从服务器获取一些数据。主要问题是我没有服务器访问权限,但我当然知道请求详细信息,我使用PostMan进行测试服务器调用,而不是使用OkHttp在android上实现它们。

以下是我使用HttpUrlConnection或OkHttp从android端服务器获取的内容:

  

{ “集合”:{ “版本”: “1.0”, “HREF”: “http://development.abc.com:80/”, “链接”:[{ “HREF”: “#”, “相对”: “首标” “提示”: “学生”},{ “HREF”: “#”, “相对”: “首部”, “提示”: “的CFA”},{ “HREF”: “注册”, “相对”:”头   试用“,”提示“:”免费试用“},{”href“:”约“,”rel“:”页脚   侧边栏 “ ”提示“: ”关于“},{ ”HREF“: ”推荐“, ”相对“:” 页脚   侧边栏”, “提示”: “推荐”},{ “HREF”: “接触”, “相对”: “页脚”, “提示”: “联系”},{ “HREF”: “常见问题解答”, “相对” :“页脚   边栏”, “提示”: “常见问题解答”},{ “HREF”: “登录”, “相对”: “登录”, “提示”: “登录”}],.......

我在两边使用相同的标题,即

("accept", "application/vnd.collection+json")
("authorization", "Basic secret==")

并使用相同的凭据进行测试登录:

奇怪的是,同一服务器调用在PostMan中提供以下数据

  

{“collection”:{“version”:“1.0”,“href”:   “http://development.abc.com:80/ch/re/videos”,   “链接”:[{“href”:   “http://development.abc.com:80/ch/re/vr”,   “rel”:“menu vrated”,“prompt”:“V rated”},{“href”:   “http://development.abc.com:80/user/watcr”,“rel”:“菜单   watchlater“,”提示“:”稍后观看“} ...

这是我的代码:

CookieManager cookieManager = new CookieManager();
            cookieManager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);

            OkHttpClient client =new OkHttpClient.Builder()
                    .cookieJar(new CookieJar() {


                        @Override
                        public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
                            cookieStore.put(url, cookies);
                            cookie=cookies.get(0).toString();


                        }

                        @Override
                        public List<Cookie> loadForRequest(HttpUrl url) {
                            List<Cookie> cookies = cookieStore.get(url);
                            return cookies != null ? cookies : new ArrayList<Cookie>();
                        }
                    })
                    .build();


            Request request = new Request.Builder()
                    .url("http://development.abc.com/login")
                    .post(body)
                    .addHeader("accept", "application/vnd.collection+json")
                    .addHeader("authorization", "Basic secret==")
                    .addHeader("cache-control", "no-cache")
                    .addHeader("Cookie",cookie)
                    .addHeader("content-type", "application/x-www-form-urlencoded")
                    .build();



            Response response = null;
            try
            {

               response=client.newCall(request).execute();
                String str=response.body().string();

            } catch (Exception e) {
                e.printStackTrace();
            }

同一服务器如何调用返回不同的结果。

我从“results from Curl is different than results from Postman”检查了一个人还应该在标题中添加user agent,所以我也试过这个,但没有运气。

如果我使用错误的凭证(即正文:电子邮件,密码)进行此调用,我会在Okhttp和PostMan上得到同样的错误。

感谢。

2 个答案:

答案 0 :(得分:0)

最后我发现了这个问题。

实际上它是一个重定向问题,需要与服务器人员交谈。 我做的是让它发挥作用

  • 进行登录服务器调用
  • 从服务器获取cookie
  • 保存Cookie
  • 再次将服务器调用与标题
  • 中的cookie一起调用

并且在这里它与邮递员的数据相同。

谢谢每一个人:)

答案 1 :(得分:0)

我最近遇到了一个类似的问题,我收到了一个成功的邮递员响应(一个加密的正文)和一个来自 OkHttp 的格式错误的加密响应。

结果我的拦截器被添加为

OkHttpClient.Builder().addNetworkInterceptor(MyInterceptor());

我可以通过将 (.addNetworkInterceptor) 更改为 (.addInterceptor) 来解决