I'm trying to send a GET request from an Android app to a web server, so the server will store the information in a database.
Here is the Android Application:
public class Final extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_final);
Button btnSend = (Button)findViewById(R.id.BtnSend);
btnSend.setOnClickListener(new OnClickListener(){
public void onClick(View arg0){
TestReceiver();
}
});
void TestReceiver()
{
//ALERT MESSAGE
Toast.makeText(getBaseContext(),"Please wait, connecting to server.",Toast.LENGTH_LONG).show();
HttpClient Client = new DefaultHttpClient();
try
{
Client.getConnectionManager().getSchemeRegistry().register(getMockedScheme());
} catch (Exception e) {
System.out.println("Error con no se que");
}
String Value="Kevin";
String URL = "http://echogame24.comli.com/Receiver.php?action="+Value;
try
{
String SetServerString = "";
// Create Request to server and get response
HttpGet httpget = new HttpGet(URL);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
SetServerString = Client.execute(httpget, responseHandler);
}
catch(Exception ex)
{
System.out.println("Fail!");
}
}
//** I added all this following the advise in the link below
public Scheme getMockedScheme() throws Exception {
MySSLSocketFactory mySSLSocketFactory = new MySSLSocketFactory();
return new Scheme("https", (SocketFactory) mySSLSocketFactory, 443);
}
class MySSLSocketFactory extends SSLSocketFactory {
javax.net.ssl.SSLSocketFactory socketFactory = null;
public MySSLSocketFactory(KeyStore truststore) throws Exception {
super(truststore);
socketFactory = getSSLSocketFactory();
}
public MySSLSocketFactory() throws Exception {
this(null);
}
@Override
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException,
UnknownHostException {
return socketFactory.createSocket(socket, host, port, autoClose);
}
@Override
public Socket createSocket() throws IOException {
return socketFactory.createSocket();
}
javax.net.ssl.SSLSocketFactory getSSLSocketFactory() throws Exception {
SSLContext sslContext = SSLContext.getInstance("TLS");
TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
sslContext.init(null, new TrustManager[] { tm }, null);
return sslContext.getSocketFactory();
}
}
}
In the accepted answer of this link:
They recommend to use the last methods so the application can send request to any server.
I also include the code of the PHP server that will accept the request:
<?php
$name="A_".$_GET["action"] ;
require_once('mysql_conexion.php');
//Here we set the variables
$country = "Prueba";
$score = 200;
//Here we create the sql sentence we will need to insert information in the Data base
$q="INSERT INTO PLAYERS(NAME, COUNTRY, SCORE) VALUES ('$name', '$country', '$score')";
$r=@mysqli_query($dbc, $q);
//Now we check if we succed or failed
if($r){
//This means we did it right
echo 'There is a new player<br>';
}else{
//This means we failed
echo '<h1>Error </h1>
<p class="error">There was an error</p>';
echo '<p>'.mysqli_error($dbc).'<br /><br />Query:'.$q.'</p>';
}
//We close now the data base connection
mysqli_close($dbc);
?>
My Problems:
After including in the Android Application the methods below **1 I have the following errors:
1-
The constructor Scheme(String, Final.MySSLSocketFactory, int) is undefined
In the Line:
return new Scheme("https", mySSLSocketFactory, 443);
2-
Multiple markers at this line - The type Final.MySSLSocketFactory must implement the inherited abstract method SocketFactory.createSocket(InetAddress, int, InetAddress, int) - The type Final.MySSLSocketFactory must implement the inherited abstract method SocketFactory.createSocket(String, int) - The type Final.MySSLSocketFactory must implement the inherited abstract method SSLSocketFactory.getSupportedCipherSuites() - The type Final.MySSLSocketFactory must implement the inherited abstract method SocketFactory.createSocket(InetAddress, int) - The type Final.MySSLSocketFactory must implement the inherited abstract method SocketFactory.createSocket(String, int, InetAddress, int) - The type Final.MySSLSocketFactory must implement the inherited abstract method SSLSocketFactory.getDefaultCipherSuites()
In the Line:
class MySSLSocketFactory extends SSLSocketFactory {
3-
The constructor SSLSocketFactory(KeyStore) is undefined
In the line:
super(truststore);
Could anyone tell me what am I doing wrong? I think I just copied that part of the code exactly like appear in the accpeted answer for the question:
Your code could be first of all simplified, i suggest you to use this android library: http://loopj.com/android-async-http/ which allows you to make every kind of HTTP requests.
After you downloaded it you should obviously import it in your project.
Code with Android Asynchronous Http Client implemented
public class Final extends Activity {
AsyncHttpClient client = new AsyncHttpClient();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_final);
Button btnSend = (Button)findViewById(R.id.BtnSend);
btnSend.setOnClickListener(new OnClickListener(){
public void onClick(View arg0){
TestReceiver();
}
});
void TestReceiver()
{
//ALERT MESSAGE
Toast.makeText(getBaseContext(),"Please wait, connecting to server.",Toast.LENGTH_LONG).show();
String Value="Kevin";
String url = "http://echogame24.comli.com/Receiver.php?action="+Value;
client.get(url, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(String response) {
Toast.makeText(getBaseContext(),"Request made successfully.",Toast.LENGTH_LONG).show();
}
});
}
}
}
来源:https://stackoverflow.com/questions/23900054/android-php-sending-a-get-request-to-php-server