私はこのリンクからアンドロイドアプリケーションでXML-RPCサーバーとクライアントを使用します:http://www.codeforest.net/how-to-build-php-xml-rpc-server-client-and-android-app通信はHTTP経由です。 HTTPS経由で通信するためにAndroidコードで何をどこで変更しなければならないか、私に説明できますか?ありがとう(私はstackoverflowの多くの記事を読んだが、私はアンドロイドコードでそれを使用する方法を知ることができません)HTTPS通信を使用するためのandroidアプリケーションのxml-rpcの変更
0
A
答えて
1
これが私の解決策であるとit'sが正常に動作:
//In class XMLRPCClient
public XMLRPCClient(URI uri) {
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", new PlainSocketFactory(),
80));
registry.register(new Scheme("https", new EasySSLSocketFactory(), 443));
postMethod = new HttpPost(uri);
postMethod.addHeader("Content-Type", "text/xml");
// WARNING
// I had to disable "Expect: 100-Continue" header since I had
// two second delay between sending http POST request and POST body
httpParams = postMethod.getParams();
HttpProtocolParams.setUseExpectContinue(httpParams, false);
this .client = new DefaultHttpClient(
new ThreadSafeClientConnManager(httpParams, registry),
httpParams);
}
そして2クラスEasySSLSocketFactoryとEasyX509TrustManager
EasySSLSocketFactory org.xmlrpc.androidに追加する必要があります。
package org.xmlrpc.android;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManager;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.conn.scheme.LayeredSocketFactory;
import org.apache.http.conn.scheme.SocketFactory;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
/**
* This socket factory will create ssl socket that accepts self signed certificate
*
* @author olamy
* @version $Id: EasySSLSocketFactory.java 765355 2009-04-15 20:59:07Z evenisse $
* @since 1.2.3
*/
public class EasySSLSocketFactory implements SocketFactory, LayeredSocketFactory {
private SSLContext sslcontext = null;
private static SSLContext createEasySSLContext() throws IOException {
try {
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, new TrustManager[] { new EasyX509TrustManager(null) }, null);
return context;
} catch (Exception e) {
throw new IOException(e.getMessage());
}
}
private SSLContext getSSLContext() throws IOException {
if (this.sslcontext == null) {
this.sslcontext = createEasySSLContext();
}
return this.sslcontext;
}
/**
* @see org.apache.http.conn.scheme.SocketFactory#connectSocket(java.net.Socket, java.lang.String, int,
* java.net.InetAddress, int, org.apache.http.params.HttpParams)
*/
public Socket connectSocket(Socket sock, String host, int port, InetAddress localAddress, int localPort,
HttpParams params) throws IOException, UnknownHostException, ConnectTimeoutException {
int connTimeout = HttpConnectionParams.getConnectionTimeout(params);
int soTimeout = HttpConnectionParams.getSoTimeout(params);
InetSocketAddress remoteAddress = new InetSocketAddress(host, port);
SSLSocket sslsock = (SSLSocket) ((sock != null) ? sock : createSocket());
if ((localAddress != null) || (localPort > 0)) {
// we need to bind explicitly
if (localPort < 0) {
localPort = 0; // indicates "any"
}
InetSocketAddress isa = new InetSocketAddress(localAddress, localPort);
sslsock.bind(isa);
}
sslsock.connect(remoteAddress, connTimeout);
sslsock.setSoTimeout(soTimeout);
return sslsock;
}
/**
* @see org.apache.http.conn.scheme.SocketFactory#createSocket()
*/
public Socket createSocket() throws IOException {
return getSSLContext().getSocketFactory().createSocket();
}
/**
* @see org.apache.http.conn.scheme.SocketFactory#isSecure(java.net.Socket)
*/
public boolean isSecure(Socket socket) throws IllegalArgumentException {
return true;
}
/**
* @see org.apache.http.conn.scheme.LayeredSocketFactory#createSocket(java.net.Socket, java.lang.String, int,
* boolean)
*/
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException,
UnknownHostException {
return getSSLContext().getSocketFactory().createSocket(socket, host, port, autoClose);
}
// -------------------------------------------------------------------
// javadoc in org.apache.http.conn.scheme.SocketFactory says :
// Both Object.equals() and Object.hashCode() must be overridden
// for the correct operation of some connection managers
// -------------------------------------------------------------------
public boolean equals(Object obj) {
return ((obj != null) && obj.getClass().equals(EasySSLSocketFactory.class));
}
public int hashCode() {
return EasySSLSocketFactory.class.hashCode();
}
}
EasyX509TrustManagerを:
package org.xmlrpc.android;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
class EasyX509TrustManager implements X509TrustManager
{
public EasyX509TrustManager(KeyStore keystore) throws NoSuchAlgorithmException, KeyStoreException {
super();
}
@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 new X509Certificate[0];
}
}
0
それはちょうどhttpsでうまくいくはずです。 httpsで始まるようにURLを変更するだけです。
注:SSL証明書が信頼できる証明書でない場合は、それに対処するロジックを記述する必要があります。ただし、証明書がデバイスと一緒に使用される場合は、他の変更は必要ありません。
関連する問題
- 1. RESTクライアントサーバー通信とgoogle oauthを使用するsyncadapterを使用したAndroidアプリケーション
- 2. 他のアプリケーションの機能を変更するためのAndroidアプリ
- 3. デバイス間通信のためのAndroid API
- 4. firebase httpsリアルタイムデータベースを変更するためのhttpsリンク
- 5. WebアプリケーションとAndroidアプリケーション間の通信
- 6. AndroidアプリケーションGWTアプリケーションと通信する
- 7. ASP.NET WebアプリケーションとMVC 3間で通信するためのRESTfulアーキテクチャの作成JSONを使用したアプリケーション
- 8. xmlrpcとsqlalchemyを使った簡単なWebアプリケーション用のPythonスタック
- 9. Android Nougat通知のインライン返信カラーを変更するには?
- 10. Android - 2つのアプリケーション間の通信?
- 11. androidのアプリケーション間の通信方法
- 12. ローカルクライアントプロセスと通信するためのGWTアプリケーションの取得
- 13. C++アプリケーションと通信するためのWebページの取得
- 14. SignalRを使用した複数のWebアプリケーション間の通信
- 15. ビューベースのアプリケーションでxmlrpc
- 16. Androidアプリケーション、クライアント - サーバ間通信
- 17. Androidアプリケーションとラズベリーパイ通信
- 18. AndroidネイティブとAIRアプリケーションの通信
- 19. web2pyでxmlrpcを使用してWebアプリケーションのコマンドラインインターフェイスを使用する
- 20. httpsを使用したドッカーでのアプリケーション
- 21. 通知のデフォルトサイズを変更する(Android)
- 22. Azure通知ハブを使用したXamarinアプリケーションからのプッシュ通知の送信
- 23. ServiceFabricローカルクラスタでのHTTPS通信
- 24. ウェブアプリケーションでWindowsアプリケーション(vb.net)を使用したアンドロイドアプリ(java)の通信
- 25. ウィンドウメッセージングを使用したJAVAとC#間のアプリケーション間通信
- 26. 通知のためのWebアプリケーションでのPhonegapの使用
- 27. Android Best-Foregroundサービスと通信するための方法
- 28. 通知のレイアウトを変更するAndroidでOnesignalを使用する場合
- 29. androidとの通信のためのksoap2とretrofit2の違い
- 30. Androidアプリケーションの言語を変更する
はい、私の証明書は信頼されていません。手伝って頂けますか?何を元気に変えなければならないのですか? – Pedro
@Pedro完璧なソリューション。私も同じ問題に直面していて、XML-RPCエラーを取得していましたが、私はあなたのソリューションを試してみましたが、今は魅力的です。 – YuDroid