首页 > 解决方案 > 如何将 PHP 与 JSON 类型标头连接起来

问题描述

这是我的 PHP 代码

<?php require_once '../includes/DbOperations.php'; $response = array(); 

if($_SERVER['REQUEST_METHOD']=='POST'){
    if(isset($_POST['username']) and isset($_POST['password']) and isset($_POST['email']))
    {
        //operate the data further 

        $db = new DbOperations(); 

        $result = $db->createUser($_POST['username'],$_POST['password'],$_POST['email']);
        if($result == 1){
            $response['error'] = false; 
            $response['message'] = "User registered successfully";
        }elseif($result == 2){
            $response['error'] = true; 
            $response['message'] = "Some error occurred please try again";          
        }elseif($result == 0){
            $response['error'] = true; 
            $response['message'] = "It seems you are already registered, please choose a different email and username";                     
        }

    }else{
        $response['error'] = true; 
        $response['message'] = "Required fields are missing";
    }
}else{
    $response['error'] = true; 
    $response['message'] = "Invalid Request";
}

echo json_encode($response);
?>

当我使用 JSON 类型标头时它不起作用

String jsonResult = null;
    JSONObject jsonObject = new JSONObject();
    try {
        jsonObject.put("username", "33");
        jsonObject.put("password", "33");
        jsonObject.put("email", "33@gmail.com");

        jsonResult = jsonObject.toString();
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    String HitURL = "http://192.xxx.xxx.xxx/Android/v1/registerUser.php";
    MediaType MEDIA_PlainMT = MediaType.parse("text/plain; charset=utf-8");
    Request request = new Request.Builder().url(HitURL).post(RequestBody.create(MEDIA_PlainMT, jsonResult)).build();

    OkHttpClient client = new OkHttpClient();
    try {
        TLSSocketFactory tlsSocketFactory=new TLSSocketFactory();
        if (tlsSocketFactory.getTrustManager()!=null) {
            client = new OkHttpClient.Builder()
                    .sslSocketFactory(tlsSocketFactory, tlsSocketFactory.getTrustManager())
                    .build();
        }
    } catch (KeyManagementException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (KeyStoreException e) {
        e.printStackTrace();
    }
    client.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(okhttp3.Call call, IOException e) {
            e.printStackTrace();
        }

        @Override
        public void onResponse(Call call, final Response response) throws IOException {
            if (!response.isSuccessful()) {
                throw new IOException("Unexpected code " + response);
            } else {
                String HitResponse = response.body().string();
                Log.v("/CheckLog/", HitResponse);
            }
        }
    });

结果

{"error":true,"message":"Required fields are missing"}

标签: phpandroidjsonapi

解决方案


您的服务器代码需要提交常规application/x-www-form-urlencoded值(也称为常规 POST 表单提交),但您的客户端正在将您的数据编码为application/json(JSON 对象)。应该是哪一个?客户端和服务器必须相互同意。

如果您想使用 JSON 作为数据编码标准,您的代码应如下所示:

<?php

require_once '../includes/DbOperations.php';
$response = array(); 

if($_SERVER['REQUEST_METHOD']=='POST'){
    $raw_input = file_get_contents('php://input');
    try {
      $input = json_decode($raw_input, TRUE, 512, JSON_THROW_ON_ERROR);
      if (isset($input['username']) and isset($input['password']) and isset($input['email']))
      {
          //operate the data further 

          $db = new DbOperations(); 

          $result = $db->createUser($input['username'],$input['password'],$input['email']);
          if($result == 1){
              $response['error'] = false; 
              $response['message'] = "User registered successfully";
          }elseif($result == 2){
              $response['error'] = true; 
              $response['message'] = "Some error occurred please try again";          
          }elseif($result == 0){
              $response['error'] = true; 
              $response['message'] = "It seems you are already registered, please choose a different email and username";                     
          }

      }else{
          $response['error'] = true; 
          $response['message'] = "Required fields are missing";
      }
  } catch (Exception $e) {
      $response['error'] = true; 
      $response['message'] = "Invalid Request: " . $e->getMessage();
  }
}else{
    $response['error'] = true; 
    $response['message'] = "Invalid Request";
}

echo json_encode($response);

推荐阅读