无法从 Android 应用程序对已部署的 PHP 服务器进行 REST API 调用?

Posted

技术标签:

【中文标题】无法从 Android 应用程序对已部署的 PHP 服务器进行 REST API 调用?【英文标题】:Can't make REST API call from Android app to deployed PHP Server? 【发布时间】:2016-12-28 14:09:54 【问题描述】:

我无法连接到托管 mysql 数据库的 Google Cloud php 服务器。这是我向我的 PHP 服务器发送通知的代码。

NotificationInstanceService.java

public class NotificationInstanceService extends FirebaseInstanceIdService 
    private static final String TAG = "NotificationInstance";

    @Override
    public void onTokenRefresh() 

        //Getting registration token
        String refreshedToken = FirebaseInstanceId.getInstance().getToken();

        //Displaying token on logcat
        Log.d(TAG, "Refreshed token: " + refreshedToken);

        sendRegistrationToServer(refreshedToken);

    

    private void sendRegistrationToServer(String token) 
        //You can implement this method to store the token on your server
        //Not required for current project
        OkHttpClient client = new OkHttpClient();
        //Create the request body
        RequestBody body = new FormBody.Builder().add("Token", token).build();
        //Know where to send the request to
        Request request = new Request.Builder().url("<app server url>/register.php")
                .post(body)
                .build();
        //Create
        try 
            client.newCall(request).execute();
         catch (IOException e) 
            e.printStackTrace();
        

    

这似乎正确地通过并且似乎没有抛出任何堆栈跟踪。然后,当我部署我的 PHP 服务器时,我创建了以下文件:

app.yaml:

application: <app server url>
service: default
runtime: php55
api_version: 1
version: alpha-001

handlers:

- url: /(.+\.(ico|jpg|png|gif))$
  static_files: \1
  upload: (.+\.(ico|jpg|png|gif))$
  application_readable: true

- url: /(.+\.(htm|html|css|js))$
  static_files: \1
  upload: (.+\.(htm|html|css|js))$
  application_readable: true

- url: /(.+\.php)$
  script: \1
  login: admin

- url: /.*
  script: index.php
  login: admin

- url: /.*
  script: register.php
  login: admin

config.inc.php:

<?php 
$cfg['blowfish_secret'] = '<Secret>'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

/*
 * Servers configuration
 */
$i = 0;

// Change this to use the project and instance that you've created.
$host = '/cloudsql/<app server url>:us-central1:<database name>-app-php';
$type = 'socket';

/*
* First server
*/
$i++;
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'cookie';
/* Server parameters */
$cfg['Servers'][$i]['socket'] = $host;
$cfg['Servers'][$i]['connect_type'] = $type;
$cfg['Servers'][$i]['compress'] = false;
/* Select mysql if your server does not have mysqli */
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['AllowNoPassword'] = true;
/*
 * End of servers configuration
 */

/*
 * Directories for saving/loading files from server
 */
$cfg['UploadDir'] = '';
$cfg['SaveDir'] = '';

$cfg['PmaNoRelation_DisableWarning'] = true;
$cfg['ExecTimeLimit'] = 60;
$cfg['CheckConfigurationPermissions'] = false;
// [END all]

php.ini:

google_app_engine.enable_functions = "php_uname, getmypid"

最后,register.php 这是我的 php 脚本,位于所有这些文件的当前目录中:

注册.php:

<?php

function dbg($data)
    file_put_contents(__DIR__.'/log.txt',$data.PHP_EOL,FILE_APPEND );


$conn = mysql_connect(':/cloudsql/<app server url>:us-central1:<database name>',
  'root', // username
  ''      // password
  );
        if (isset($conn) && isset($_POST["Token"])) 
                   $_uv_Token=$_POST["Token"];
                   echo $conn;
                   $q="INSERT INTO users (Token) VALUES ( '$_uv_Token') "
              ." ON DUPLICATE KEY UPDATE Token = '$_uv_Token';";

      $result = mysqli_query($conn,$q) or die(mysqli_error($conn));
    // check if row inserted or not
    if ($result) 
        // successfully inserted into database
        $response["success"] = 1;
        $response["message"] = "Inserted successfully created.";

        // echoing JSON response
        echo json_encode($response);
     else 
        // failed to insert row
        $response["success"] = 0;
        $response["message"] = "Oops! An error occurred.";

        // echoing JSON response
        echo json_encode($response);
    

    dbg($q); /* where $q is the sql */
    dbg(print_r($result,true)); /* config */

      mysqli_close($conn);
        
 ?>

我似乎无法找到我的问题所在。我似乎无法调试或找到任何错误日志,说明我是否连接到错误的数据库,或者我的 REST 调用是否因某种原因而被截获。似乎在客户端,在NotificationInstanceService.java 中,注册令牌被发送到服务器,但服务器实际上从未在其中存储 id 或令牌。我很确定我的应用程序服务器的所有 URL 都已正确配置。我尝试$echo 所有的回复,我得到了这样的回复,但似乎找不到在哪里获得这些$echo 声明。任何帮助将非常感激。谢谢!

【问题讨论】:

【参考方案1】:

您可能会做的一件事来帮助调试(除了检查 php 错误日志)是编写一个写入文本文件的小函数。

function dbg($data)
    file_put_contents(__DIR__.'/log.txt',$data.PHP_EOL,FILE_APPEND );


/* then call it like: */
dbg($q); /* where $q is the sql */
dbg(print_r($cfg,true)); /* config */

然后通过 php 代码使用它来查看您在各个阶段获得的数据 - 通过 ftp 下载或使用浏览器浏览到该文件位置。只是一个想法......

<?php

    function dbg($data)
        file_put_contents( __DIR__.'/log.txt', $data.PHP_EOL, FILE_APPEND );
    

    /* !! assuming `config.inc.php` is available in `register.php` !! */
    dbg( print_r( $cfg, true ) );

    $conn = mysql_connect(':/cloudsql/<app server url>:us-central1:<database name>',
        'root',
        ''
    );

    dbg( 'errors: '.mysql_error( $conn ) );


    if ( $conn && isset( $_POST["Token"] ) ) 
        $_uv_Token=$_POST["Token"];

        dbg('POST-Token: '.$_uv_Token);

        $q="INSERT INTO users (Token) VALUES ( '$_uv_Token') ON DUPLICATE KEY UPDATE Token = '$_uv_Token';";
        dbg('sql: '.$q);


        $result = mysqli_query($conn,$q) or die(mysqli_error($conn));
        dbg('Query succeeded: '.$result);


        if ($result) 

            $response["success"] = 1;
            $response["message"] = "Inserted successfully created.";
            echo json_encode($response);

         else 
            $response["success"] = 0;
            $response["message"] = "Oops! An error occurred.";
            echo json_encode($response);
        

        mysql_close( $conn );
    
?>

config.inc.php 是否包含在 register.php 中?我问是因为您在配置文件中定义了各种设置,然后继续,在register.php 中再次对它们进行硬编码。

【讨论】:

我尝试了您的建议并将您的代码放在我的 register.php 文件中,但我没有看到在我的本地目录中创建 log.txt。我可以在如何调试它时查看其他任何内容? php 错误日志(如果您可以访问它)可能会显示错误?我注意到的一件事是echo $conn; ~ 因为$conn 是一个容易导致错误的对象!此外,您正在混合使用 mysqlmysqli 函数 我尝试按照您的建议进行操作,但似乎仍然无法在 log.txt 中获得任何输出。奇怪的是,我似乎能够部署 index.php 之类的脚本,与它们进行交互等,以及 server_databases.php 之类的东西,但我似乎无法让我自己的 php 脚本工作......

以上是关于无法从 Android 应用程序对已部署的 PHP 服务器进行 REST API 调用?的主要内容,如果未能解决你的问题,请参考以下文章

无法检测从android发送的php中的Post参数

从 Android 应用程序调用 PHP REST API 无法正确显示变音符号 (äüö)

无法在 android 浏览器中使用 php 下载文件

Android Management Api 失去对已注册设备的控制权

AWS OpsWorks 应用程序层:无法从 PHP 应用程序访问环境变量

Android HttpUrlConnection 无法正常工作