使用 JSON 数据从 Android 向服务器发送数据

Posted

技术标签:

【中文标题】使用 JSON 数据从 Android 向服务器发送数据【英文标题】:Sending Data From Android To Server with JSON data 【发布时间】:2012-01-09 04:38:48 【问题描述】:

我正在尝试将数据从 android 应用程序发送到 Web 服务器。我的 android 应用程序运行成功。但是 php 代码有问题。

<?php
$json = $_SERVER['HTTP_JSON'];
echo "JSON: \n";
var_dump($json);
echo "\n\n";

$data = json_decode($json,true);
echo "Array: \n";
var_dump($data);
echo "\n\n";

$name = $data['name'];
$pos = $data['position'];
echo "Result: \n";
echo "Name     : ".$name."\n Position : ".$pos; 
?>

错误:

Notice: Undefined index: HTTP_JSON in C:\wamp\www\jsonTest.php on line 2
( line 2 : $json = $_SERVER['HTTP_JSON']; )

我找不到这些问题的原因。你能帮助我吗 ? (注意:我使用的是 wamp 服务器)

这里是相关的 Android 源代码:

// Create a new HttpClient and Post Header 
HttpClient httpclient = new DefaultHttpClient(); 
HttpPost httppost = new HttpPost("10.0.2.2:90/jsonTest.php";); 

JSONObject json = new JSONObject(); 
try  
    json.put("name", "flower"); 
    json.put("position", "student"); 
    JSONArray postjson=new JSONArray(); 
    postjson.put(json); 
    httppost.setHeader("json",json.toString());
    httppost.getParams().setParameter("jsonpost",postjson); 
    System.out.print(json); 
    HttpResponse response = httpclient.execute(httppost); 

    if(response != null)
    
    InputStream is = response.getEntity().getContent();

    BufferedReader reader = new BufferedReader(new InputStreamReader(is));
    StringBuilder sb = new StringBuilder();

    String line = null;
    try 
        while ((line = reader.readLine()) != null) 
            sb.append(line + "\n");
        
         catch (IOException e) 
        e.printStackTrace();
         finally 
        try 
        is.close();
         catch (IOException e) 
        e.printStackTrace();
        
        
    text = sb.toString();
    
    tv.setText(text);

catch (ClientProtocolException e) 
    // TODO Auto-generated catch block
 catch (IOException e) 
    // TODO Auto-generated catch block

此代码在 android 端成功运行(无错误)。但是php方面有问题.. 谢谢。

【问题讨论】:

【参考方案1】:

这不是您的 JSON 所在的位置:

$json = $_SERVER['HTTP_JSON'];

你的意思可能是:

$json = $_POST['HTTP_JSON'];

HTTP_JSON 是您在 Android 应用中为 JSON 提供的 POST 变量名称。

其余的错误源于 json_decode 失败的事实,因为您没有成功地从请求中读取 JSON 数据。你可以查看json_decode的回复来判断是否成功,如下:

$data = json_decode($json,true);
if( $data === NULL)

    exit( 'Could not decode JSON');

最后,将true 作为第二个参数传递给json_encode 意味着它将返回一个关联数组,因此您可以像这样访问元素:

$name = $data['name'];
$pos = $data['position'];

请确保您 read the docs 获取 json_encode,以便您了解它在做什么。

编辑:您的问题是您通过错误的名称访问$_POST 参数。您应该使用:

$json = $_POST['jsonpost'];

由于以下行将参数命名为“jsonpost”:

httppost.getParams().setParameter("jsonpost",postjson);

【讨论】:

感谢您的回答。我使用 $_POST 而不是 $_SERVER 但同样的错误:注意:未定义的索引:第 3 行 C:\wamp\www\jsonTest.php 中的 HTTP_JSON。 您的 PHP 脚本没有获取 JSON 数据...发布您将 JSON 发送到服务器的 Android 代码的相关部分。 部分代码://新建HttpClient和Post Header HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("localhost:90/jsonTest.php"); JSONObject json = new JSONObject(); try json.put("name", "Irem"); json.put("position", "student"); JSONArray postjson =new JSONArray(); postjson.put(json); httppost.setHeader("json",json.toString()); httppost.getParams().setParameter("jsonpost",postjson); System.out.print(json ); HttpResponse 响应 = httpclient.execute(httppost); 我也试过你的最后一个解决方案。但是错误没有改变。 wamp服务器会导致这个问题吗? @iremce - 不,WAMP 不应该有所作为。让我检查一下我的一个 Android 项目,看看你是否在客户端做错了什么。【参考方案2】:

由于我不知道java客户端如何发送请求 我会尝试:

print_r($_SERVER);
print_r($_GET);
print_r($_POST);

弄清楚它是怎么做的。

【讨论】:

【参考方案3】:

试试这些行:

httppost.setHeader("Accept", "application/json");
     httppost.setHeader("Content-type", "application/json"); 

【讨论】:

以上是关于使用 JSON 数据从 Android 向服务器发送数据的主要内容,如果未能解决你的问题,请参考以下文章

Android 手机卫士--构建服务端json请求网络数据

从 Android 向 Laravel 发送 JSON

TCP网络编程-----客户端请求连接服务器向服务器发数据从服务器接收数据关闭连接

如何向php服务器发送数据为json的post请求

Android或者Java发送Http自动重发请求的解决方案

示例:使用AsyncTask的Android双向网络套接字