OkHTTP (v3.0.0-RC1) Post 带参数请求
OkHTTP (v3.0.0-RC1) Post Request with Parameters
更新
我正在使用 okHttp 库,版本 3.0.0 RC-1。我有一个 url,我必须发送一个带有参数的 post 请求。例如:https://myurl.com/login?username=123456&password=12345
我有这样的代码:
public String okHttpRequest(){
try {
final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
};
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null,trustAllCerts, new java.security.SecureRandom());
final javax.net.ssl.SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory);
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
}).build();
final OkHttpClient client = new OkHttpClient();
HttpUrl url = HttpUrl.parse("https://myUrl.com/login").newBuilder()
.addQueryParameter("username", "123456")
.addQueryParameter("password", "123456")
.build();
Request request = new Request.Builder()
.url(url)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
Log.d("Request:", "Is NOT sent " + request.toString() + " METHOD: " + request.method());
e.printStackTrace();
}
@Override
public void onResponse(Response response) throws IOException {
Log.d("Request:", "Is sent " + response.toString());
}
});
}catch(Exception e){
e.printStackTrace();
}
return "okHttp is Working!!! ";
}
每当我尝试时,它都会失败,所以 onFailure 方法正在执行。问题是什么?我是否错误地添加了请求参数?请帮忙...
是的,您添加的查询参数不正确。应该怎么做:
final OkHttpClient client = new OkHttpClient();
HttpUrl url = HttpUrl.parse("https://myUrl.com/login").newBuilder()
.addQueryParameter("password", "123456")
.addQueryParameter("username", "123456")
.build();
Request request = new Request.Builder()
.url(url)
.build();
(...)
问题是您在请求正文中提交数据,就好像它是 HTML 表单提交一样,而不是像您预期的那样作为查询参数。使用 HttpUrl 可以将查询参数添加到 URL.
值得注意的是,您也可以简单地这样做:
Request request = new Request.Builder()
.url("https://myurl.com/login?username=123456&password=12345")
.build();
所以:
使用 HttpUrl
和它的构建器来创建您的 URL 并添加参数。
如果需要,请使用 FormBody
创建您的请求内容(就像您提交的 html 表单一样)。
此外,请确保您的应用程序具有互联网权限,确保您有有效的互联网连接等,但您似乎已经拥有。
注意:这是针对 OkHttp 2.x(因为这是我使用的),但它应该与 3.x 相同或相似。
让我知道它是否适合你。
更新
我正在使用 okHttp 库,版本 3.0.0 RC-1。我有一个 url,我必须发送一个带有参数的 post 请求。例如:https://myurl.com/login?username=123456&password=12345
我有这样的代码:
public String okHttpRequest(){
try {
final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
};
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null,trustAllCerts, new java.security.SecureRandom());
final javax.net.ssl.SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory);
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
}).build();
final OkHttpClient client = new OkHttpClient();
HttpUrl url = HttpUrl.parse("https://myUrl.com/login").newBuilder()
.addQueryParameter("username", "123456")
.addQueryParameter("password", "123456")
.build();
Request request = new Request.Builder()
.url(url)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
Log.d("Request:", "Is NOT sent " + request.toString() + " METHOD: " + request.method());
e.printStackTrace();
}
@Override
public void onResponse(Response response) throws IOException {
Log.d("Request:", "Is sent " + response.toString());
}
});
}catch(Exception e){
e.printStackTrace();
}
return "okHttp is Working!!! ";
}
每当我尝试时,它都会失败,所以 onFailure 方法正在执行。问题是什么?我是否错误地添加了请求参数?请帮忙...
是的,您添加的查询参数不正确。应该怎么做:
final OkHttpClient client = new OkHttpClient();
HttpUrl url = HttpUrl.parse("https://myUrl.com/login").newBuilder()
.addQueryParameter("password", "123456")
.addQueryParameter("username", "123456")
.build();
Request request = new Request.Builder()
.url(url)
.build();
(...)
问题是您在请求正文中提交数据,就好像它是 HTML 表单提交一样,而不是像您预期的那样作为查询参数。使用 HttpUrl 可以将查询参数添加到 URL.
值得注意的是,您也可以简单地这样做:
Request request = new Request.Builder()
.url("https://myurl.com/login?username=123456&password=12345")
.build();
所以:
使用
HttpUrl
和它的构建器来创建您的 URL 并添加参数。如果需要,请使用
FormBody
创建您的请求内容(就像您提交的 html 表单一样)。
此外,请确保您的应用程序具有互联网权限,确保您有有效的互联网连接等,但您似乎已经拥有。
注意:这是针对 OkHttp 2.x(因为这是我使用的),但它应该与 3.x 相同或相似。
让我知道它是否适合你。