java - OkHTTP (v3.0.0-RC1) 带参数的 Post 请求

标签 java android ssl ssl-certificate okhttp

更新 我正在使用 okHttp 库,版本 3.0.0 RC-1。我有一个网址,并且必须发送带有参数的 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 应该是相同或相似的。

请告诉我它是否适合您。

关于java - OkHTTP (v3.0.0-RC1) 带参数的 Post 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34719108/

相关文章:

java - 如何更改数组列表中的整数而不丢失其在该列表中的顺序

java - 读取一个txt文件(奇怪的符号)JAVA

java - Android 致命信号 7 (SIGBUS)

java - 自签名证书与 CA

python - "' 模块 ' object has no attribute ' SSLContext '"使用 flocker-api 时出错

java - tess4j OCRtest JBoss 错误 java.lang.NoSuchMethodError

java - 将字节(java 数据类型)值转换为位(仅包含 8 位的字符串)

Android数据绑定(bind): @Binable vs Observablefield performance

java - 强制 React-Native webview 将 url 加载为移动设备?

ssl - 无法让 SSL 在 Azure 实例上运行