从邮递员那里获得关于 OKHTTP 的不同结果
Getting different result on OKHTTP from postman
我正在尝试从服务器获取一些数据。主要问题是我没有服务器访问权限,但我当然知道请求的详细信息,我正在使用 PostMan 进行测试服务器调用,而不是使用 OkHttp 在 android 上实现它们。
这是我使用 HttpUrlConnection 或 OkHttp 从 android 端的服务器获得的内容:
{"collection":{"version":"1.0","href":"http://development.abc.com:80/","links":[{"href":"#","rel":"header","prompt":"Students"},{"href":"#","rel":"header","prompt":"CFAs"},{"href":"signup","rel":"header
trial","prompt":"Free Trial"},{"href":"about","rel":"footer
sidebar","prompt":"About"},{"href":"testimonials","rel":"footer
sidebar","prompt":"Testimonials"},{"href":"contact","rel":"footer","prompt":"Contact"},{"href":"faq","rel":"footer
sidebar","prompt":"FAQs"},{"href":"login","rel":"login","prompt":"Login"}],.......
我在两侧使用相同的 header,即
("accept", "application/vnd.collection+json")
("authorization", "Basic secret==")
并使用相同的凭据进行测试登录:
奇怪的是,同一个服务器调用在 PostMan 中给出了以下数据
{ "collection": { "version": "1.0", "href":
"http://development.abc.com:80/ch/re/videos",
"links": [ { "href":
"http://development.abc.com:80/ch/re/vr",
"rel": "menu vrated", "prompt": "V rated" }, { "href":
"http://development.abc.com:80/user/watcr", "rel": "menu
watchlater", "prompt": "Watch later" }...
这是我的代码:
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”中查到还需要在 header 中添加 user agent
所以我也尝试了这个但没有成功。
还有一件事,如果我为此调用使用了错误的凭据(即 body:电子邮件、密码),我在 Okhttp 和 PostMan 上都会遇到同样的错误。
谢谢。
终于找到问题所在了。
实际上这是一个重定向问题,需要与服务器人员交谈。
我做的是
- 调用登录服务器
- 从服务器获得 cookie
- 保存 cookie
- 再次调用服务器以及 header
中的 cookie
是的,这里的数据与邮递员的数据相同。
谢谢大家:)
我最近遇到了一个类似的问题,我得到了一个成功的邮递员响应(一个加密的正文)和一个来自 OkHttp 的格式错误的加密响应。
原来我的拦截器被添加为
OkHttpClient.Builder().addNetworkInterceptor(MyInterceptor());
我可以通过将 (.addNetworkInterceptor) 更改为 (.addInterceptor) 来解决
我正在尝试从服务器获取一些数据。主要问题是我没有服务器访问权限,但我当然知道请求的详细信息,我正在使用 PostMan 进行测试服务器调用,而不是使用 OkHttp 在 android 上实现它们。
这是我使用 HttpUrlConnection 或 OkHttp 从 android 端的服务器获得的内容:
{"collection":{"version":"1.0","href":"http://development.abc.com:80/","links":[{"href":"#","rel":"header","prompt":"Students"},{"href":"#","rel":"header","prompt":"CFAs"},{"href":"signup","rel":"header trial","prompt":"Free Trial"},{"href":"about","rel":"footer sidebar","prompt":"About"},{"href":"testimonials","rel":"footer sidebar","prompt":"Testimonials"},{"href":"contact","rel":"footer","prompt":"Contact"},{"href":"faq","rel":"footer sidebar","prompt":"FAQs"},{"href":"login","rel":"login","prompt":"Login"}],.......
我在两侧使用相同的 header,即
("accept", "application/vnd.collection+json")
("authorization", "Basic secret==")
并使用相同的凭据进行测试登录:
奇怪的是,同一个服务器调用在 PostMan 中给出了以下数据
{ "collection": { "version": "1.0", "href": "http://development.abc.com:80/ch/re/videos", "links": [ { "href": "http://development.abc.com:80/ch/re/vr", "rel": "menu vrated", "prompt": "V rated" }, { "href": "http://development.abc.com:80/user/watcr", "rel": "menu watchlater", "prompt": "Watch later" }...
这是我的代码:
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”中查到还需要在 header 中添加 user agent
所以我也尝试了这个但没有成功。
还有一件事,如果我为此调用使用了错误的凭据(即 body:电子邮件、密码),我在 Okhttp 和 PostMan 上都会遇到同样的错误。
谢谢。
终于找到问题所在了。
实际上这是一个重定向问题,需要与服务器人员交谈。 我做的是
- 调用登录服务器
- 从服务器获得 cookie
- 保存 cookie
- 再次调用服务器以及 header 中的 cookie
是的,这里的数据与邮递员的数据相同。
谢谢大家:)
我最近遇到了一个类似的问题,我得到了一个成功的邮递员响应(一个加密的正文)和一个来自 OkHttp 的格式错误的加密响应。
原来我的拦截器被添加为
OkHttpClient.Builder().addNetworkInterceptor(MyInterceptor());
我可以通过将 (.addNetworkInterceptor) 更改为 (.addInterceptor) 来解决