Получите ответ JSON с сайта WordPress, woocommerce с базовой аутентификацией - PullRequest
0 голосов
/ 07 января 2019

Я занимаюсь разработкой приложения для Android, которое получает продукты с сайта WordPress. Плагин Woocommerce установлен на веб-сайте. Я могу получить Json этого сайта с помощью программного обеспечения Postman, используя обычную аутентификацию. Имя пользователя и пароль - это ключ API и секрет API, которые генерирует сайт WordPress. нет проблем, когда я использую GET с меткой Почтальона. но у меня есть проблема, когда я хочу подключиться к сайту через приложение для Android, и получил ошибку. вот как я запрашиваю данные Json:

 public void newMyResponse(String url){

    //RequestQueue requestQueue;
    queue.add(new JsonArrayRequest(Request.Method.GET,
            url,null, new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray response) {
            Log.d("Products",response.toString());

            for(int i=0; i<response.length(); i++){
                try {
                    JSONObject jsonObject_products = response.getJSONObject(i);
                    Log.d("Items id: ",jsonObject_products.getString("id"));
                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d("Error8", error.getMessage());
        }
    }) {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {

            Map<String, String> headers = new HashMap<>();
            String credentials = "ck_...:cs_...";
            String auth = "Basic "
              +Base64.encodeToString(credentials.getBytes(),Base64.NO_WRAP);
            headers.put("Content-Type", "application/json");
            headers.put("Authorization", auth);
            return headers;

        }
});

1 Ответ

0 голосов
/ 06 марта 2019

Хорошо, после нескольких дней поиска, наконец, я обнаружил проблему. Мой сайт использует https с самоподписным сертификатом. Поэтому приложению необходим сертификат для работы с ним. Прежде всего, скачайте сертификат вашего сайта, как указано здесь: Экспортный сертификат Итак, как я выяснил, лучший способ - это добавить приведенный ниже код в метод oncreate того действия, которое будет аутентифицироваться:

hurlStack = new HurlStack() {
        @Override
        protected HttpURLConnection createConnection(java.net.URL url)
                throws IOException {
            HttpsURLConnection httpsURLConnection = (HttpsURLConnection) super
                    .createConnection(url);
            try {


httpsURLConnection.setSSLSocketFactory(getSSLSocketFactory(getApplicationContext()));

                } catch (Exception e) {
                    e.printStackTrace();
                }
                return httpsURLConnection;
            }
        };
    queue = newRequestQueue(this, hurlStack);

Я должен упомянуть, что queue и hurlStack должны быть определены как:

 private RequestQueue queue;
 private HurlStack hurlStack;

Затем добавьте сертификат вашего веб-сайта в необработанную папку, в моем случае имя файла - Certificate. И добавьте этот метод в действие, над которым вы работаете:

 public SSLSocketFactory getSSLSocketFactory(Context context)
        throws CertificateException, KeyStoreException, IOException,
        NoSuchAlgorithmException, KeyManagementException {

// the certificate file will be stored in \app\src\main\res\raw folder path
        CertificateFactory cf = CertificateFactory.getInstance("X.509");
        InputStream caInput = context.getResources().openRawResource(R.raw.certificate);

    Certificate ca = cf.generateCertificate(caInput);
    caInput.close();

    KeyStore keyStore = KeyStore.getInstance("BKS");

    keyStore.load(null, null);
    keyStore.setCertificateEntry("ca", ca);

    String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
    tmf.init(keyStore);

    TrustManager[] wrappedTrustManagers = getWrappedTrustManagers(tmf.getTrustManagers());

    SSLContext sslContext = SSLContext.getInstance("TLS");
    sslContext.init(null, wrappedTrustManagers, null);

    return sslContext.getSocketFactory();
}

private TrustManager[] getWrappedTrustManagers(TrustManager[] trustManagers) {

    final X509TrustManager originalTrustManager = (X509TrustManager) trustManagers[0];

    return new TrustManager[]{new X509TrustManager() {
        public X509Certificate[] getAcceptedIssuers() {
            return originalTrustManager.getAcceptedIssuers();
        }

        public void checkClientTrusted(X509Certificate[] certs, String authType) {
            try {
                if (certs != null && certs.length > 0) {
                    certs[0].checkValidity();
                } else {
                    originalTrustManager
                            .checkClientTrusted(certs, authType);
                }
            } catch (CertificateException e) {
                Log.w("checkClientTrusted", e.toString());
            }
        }

        public void checkServerTrusted(X509Certificate[] certs, String authType) {
            try {
                if (certs != null && certs.length > 0) {
                    certs[0].checkValidity();
                } else {
                    originalTrustManager
                            .checkServerTrusted(certs, authType);
                }
            } catch (CertificateException e) {
                Log.w("checkServerTrusted", e.toString());
            }
        }
    }};
}
...