0

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

这是我使用 HttpUrlConnection 或 OkHttp 从 android 端的服务器获得的信息:

{"collection":{"version":"1.0","href":" http://development.abc.com:80/ ","links":[{"href":"#","re​​l" :"header","prompt":"学生"},{"href":"#","re​​l":"header","prompt":"CFA"},{"href":"signup"," rel":"header trial","prompt":"免费试用"},{"href":"about","re​​l":"footer sidebar","prompt":"About"},{"href": "推荐","re​​l":"页脚侧边栏","prompt":"推荐"},{"href":"contact","re​​l":"footer","prompt":"联系方式"},{"href":"faq","re​​l":"footer sidebar","prompt":"FAQs"},{"href":"login","re​​l":"login","prompt “:“登录”}],.......

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

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

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

奇怪的是,相同的服务器调用在 PostMan 中给出了以下数据

{“集合”:{“版本”:“1.0”,“href”:“ http://development.abc.com:80/ch/re/videos ”,“链接”:[{“href”:“ http ://development.abc.com:80/ch/re/vr ", "rel": "menu vrated", "prompt": "Vrated" }, { "href": " http://development.abc .com:80/user/watcr ", "rel": "menu watchlater", "prompt": "稍后观看" }...

这是我的代码:

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();
            }

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

我从“ Curl 的结果与 Postman 的结果不同”中检查了一个还应该添加user agent标题的人,所以我也尝试了这个,但没有运气。

还有一件事,如果我为此调用使用了错误的凭据(即正文:电子邮件、密码),我在 Okhttp 和 PostMan 上都会收到相同的错误。

谢谢。

4

2 回答 2

0

最后我发现了这个问题。

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

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

是的,这里的数据与邮递员相同。

感谢大家 :)

于 2016-04-15T10:11:02.537 回答
0

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

原来我的拦截器被添加为

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

我能够通过将 (.addNetworkInterceptor) 更改为 (.addInterceptor) 来解决

于 2021-05-31T07:00:54.587 回答