您的位置:首页 > 理论基础 > 计算机网络

使用HttpURLConnection 与 sae 进行数据交互

2016-03-26 14:37 567 查看
使用android post 数据给服务器有很多种方式,本人第一次使用的是 HttpURLConnection,感兴趣的可以看HttpClient,不过Apache 的 HttpClient 在 安卓 5.0之后已经废弃,当然我们可以通过各种方法继续使用 HttpClient,接下来上代码:

首先是布局,就一个按钮:

<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="传数据给数据库" />


接下来是 Activity 类:

private final String url = "******";

btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

new Thread()
{
public void run()
{
try
{
String s = editText.getText().toString();
JSONObject jsonObject = new JSONObject();
JSONObject jsonObject2 = new JSONObject();

try {
jsonObject.put("username", s);
jsonObject2.put("person", jsonObject);
//Log.v("hlsjfl",jsonObject2.toString());

} catch (JSONException e) {
e.printStackTrace();
}
String content = String.valueOf(jsonObject2);

post(url, content);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}.start();
}
});

public static void post(String path2, String content) {
try {
URL url = new URL(path2);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Uer-Agent", "Fiddler");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("Charset", "utf-8");
OutputStream os = conn.getOutputStream();

os.write(content.getBytes());
os.close();
int code = conn.getResponseCode();
if(code == 200)
{
Log.v("hlkfjlasd","Post成功啦"+code);
}

} catch (Exception e) {
e.printStackTrace();
}
}
}


客户端的数据 post 给服务器,服务器用什么来接收都是可以的,只要符合规则,即可以成功获取,在做这个测试的时候,我用的是 sae,使用php来接受数据,当然这里的 php 地址也就是上面的 url 啦:

<?php
header("Content-type: text/html; charset=utf-8");
// 连主库,这是 sae 要求的
$db = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);

$post_array = file_get_contents('php://input');  //接收POST数据

if(empty($post_array))
{
echo "post过来的数据为空"."<br/>";
}
else
{
echo "post过来的数据不是空的"."<br/>";
$obj=json_decode($post_array,TRUE);
$order_id = $obj['person']['username'];//获取用户名
$sql4 = "插入语句";
mysql_query($sql4);
}


接下来,如果数据传递成功,客户端可以接收来自服务器 的数据:

InputStream is = conn.getInputStream();//获取输入流
byte [] data = revStream(is);//把输入流转换成字符串组
String json = new String(data);//把字符串组转换成字符串
Log.v("sldkjflkasjf",json);


private static byte[] revStream(InputStream inputStream) throws Exception
{
ByteArrayOutputStream ba = new ByteArrayOutputStream();
byte[] b = new byte[1024];
int len;
while ((len = inputStream.read(b)) != -1)
{
ba.write(b, 0, len);
}

ba.close();
inputStream.close();
return ba.toByteArray();
}


而想要传递数据给 客户端,php 只需将相应的数据 echo 即可,当然要注意一下json的格式,本次测试使用的是 json,比较麻烦的是需要将一个个输入的数据转换成json格式再传,Android Studio 提供的GsonFormat 可以非常方便地进行 json 与 Java Bean 的转换,同时 谷歌的 OkHttp实现了几乎和java.net.HttpURLConnection一样的API,所以使用 Okhttp 也是非常不错的。

温馨提示:

如果运行遇到 java.net.UnknownHostException: Unable to resolve host ” 这里是你的url地址”: No address associated with hostname ,大部分情况是没有联网,或者url 地 址没有写对。

另外,每次如果你想单独运行 php file 企图得到输出时,获取的数据永远为空,因为数据只有在客户端 post 的时候 通过php传到数据库,php在这里这是中介,如果只是单独运行 php 文件,并没有与客户端有什么联系,得到的结果当然也是空的咯。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: