私のアプリケーションでは、RESTサービスを使用しているリモートサーバーのAndroidアプリケーションXMLデータから投稿します。POST over SSL/HTTPS REST Api Androidが応答していません400 Bad Request
String url = "api.example.com";
int port = 443;
String query = "<?xml version='1.0' encoding='UTF-8'?><request><client><name>APIappDevAccount</name><password>123456</password></client><user><name>foyzulkarim</name><password>123456</password><groupId>12345</groupId></user></request>";
Socket socket = null;
try {
socket = new Socket(url,port);
} catch (UnknownHostException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
BufferedReader br = null;
try {
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
PrintStream pw = null;
try {
pw = new PrintStream(socket.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
pw.print("POST api.example.com/rest/rest/user");
pw.print("Content-Type: application/xml");
pw.print("Content-Length:" + query.length());
pw.print(query);
System.out.println("hello foysal.");
//get result
String l = null;
String text="";
try {
while ((l=br.readLine())!=null) {
System.out.println(l);
text+=l;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
pw.close();
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
しかし、そのサーバは、SSL/HTTPSの後ろに私は応答として400以下の不正な要求を取得していたプロトコルである:私のコードは以下の通りです。
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"><html><head><title>400 Bad Request</title></head><body><h1>Bad Request</h1><p>Your browser sent a request that this server could not understand.<br />Reason: You're speaking plain HTTP to an SSL-enabled server port.<br />Instead use the HTTPS scheme to access this URL, please.<br /><blockquote>Hint: <a href="https://api.example.com/"><b>https://api.example.com/</b></a></blockquote></p></body></html>
私は
SocketFactory socketFactory = SSLSocketFactory.getDefault();
Socket socket = null;
try {
socket = socketFactory.createSocket(url, port);
以下のようなのSSLSocketFactoryを使用している場合は、私は私の質問は、私がデータを投稿することができますどのように、あるライン
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
で例外
javax.net.ssl.SSLException: Not trusted server certificate
java.security.cert.CertPathValidatorException: TrustAnchor for CertPath not found.
を得ましたSSL経由で私の上記のシナリオでは、Androidアプリケーションですか? 私たちの多くはこの問題に直面していると思いますので、私はあなたに私/私たちにいくつか精巧な答えを与えるように依頼しています。
私がHttpClientを使用している場合、削除または更新コマンドで例が見つかりませんでした。さらに、XMLをポストすることはAPIの主な要件です。 –
サービスはプレーンなHTTP経由でリクエストを受け入れますか? 400の悪い要求は、SSLが正常に動作することを示唆していますが、あなたの手作りのHTTPは不正な形式です。 PrintStreamを行います。改行で各ヘッダを終了させても印刷できますか? Apache HttpClientを使用することをお勧めします。これは、アプリケーションのフットプリントを増やさずに、ご使用のプラットフォームですでに利用可能なようです。それは私が存在していたよりも多くのメソッドをサポートしています:http://hc.apache.org/httpclient-3.x/methods.html – Szocske
スレッドで詳しく説明しますhttp://stackoverflow.com/questions/6571480/where -do-i-put-the-rest-client-authentication-data-in-the-query –