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

Java OkHTTP(v3.0.0-RC1)带参数的Post请求,java,android,ssl,ssl-certificate,okhttp,Java,Android,Ssl,Ssl Certificate,Okhttp,更新 我正在使用okHttp库,版本3.0.0RC-1。我有一个url,我必须发送一个带有参数的post请求。例如:https://myurl.com/login?username=123456&password=12345 我有这样的代码: public String okHttpRequest(){ try { final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager(

更新 我正在使用okHttp库,版本3.0.0RC-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表单一样)

另外,确保你的应用程序中有互联网权限,确保你有一个活动的互联网连接,等等,但看起来你已经有了

注意:这是针对OKHTTP2.x的(因为我使用的是OKHTTP2.x),但对于3.x应该是相同或相似的


让我知道它是否适合您。

尝试与邮递员检查请求,看看您的请求是否有效请学习http基础知识。。。什么是body,什么是query string…@Selvin我知道,但我不知道用okhttp的post发送请求参数的方法..用okhttp的post发送请求参数。。。然后呢?你做到了。。。但服务器可能“不理解”请求。。。它可能a)不接受邮寄b)不接受x-www-form-urlencoded@Selvin那么我如何解决这个问题呢?结果:未发送请求{method=GET,url=,tag=null}method:GET必须是POST-Request..@Alvin,尝试记录IoException并将堆栈跟踪添加到您的问题中。我将更新我的答案,使其改为使用Post请求。以下是例外:javax.net.ssl.SSLPeerUnverifiedException:Hostname myUrl.com未验证: