使用 okhttp 与 sae 进行数据交互

之前使用了 HttpURLConnection 与 sae 进行交互,
http://blog.csdn.net/handsonn/article/details/50986775
这里换了 okhttp3,换汤不换药,过程一样的,记录这里以后可以用
这篇添加了上传图片的功能,上传到新浪云然后返回链接,然后可以通过Glide直接显示这个链接的图片,分成两个部分,上传json数据 和 上传图片,注意加上权限

 <uses-permission android:name="android.permission.INTERNET"/>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

第一部分:上传 json 数据
首先是客户端
实体类User,用as插件GsonFormat生成,在GsonFormat的面板中输入json格式的数据,就会生成get和set方法

public class User
{

    /**
     * name : haha
     * password : aaaa
     */

    private String name;
    private String password;
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public String getPassword()
    {
        return password;
    }
    public void setPassword(String password)
    {
        this.password = password;
    }
}

主类,使用 Gson 将实体类的对象转换成 json 格式字符串

public class MainActivity extends AppCompatActivity
{
    public static MediaType JSON = MediaType.parse("application/json;charset=utf-8");
    User u;
    String json;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        u = new User();
        u.setName("haha");
        u.setPassword("aaaa");
        Gson gson = new Gson();
        json = gson.toJson(u);
        Log.v("Json", json);
        new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                initData();
            }
        }).start();

    }
    private  void initData()
    {
        OkHttpClient okHttpClient = new OkHttpClient();
        RequestBody requestBody = RequestBody.create(JSON,json);

        Request request = new Request.Builder()
                .url("****")
                .post(requestBody)
                .build();
        try
        {
            Response response = okHttpClient.newCall(request).execute();

            /*
        或者这样
         Call call = okHttpClient.newCall(request);
            call.enqueue(new Callback() 
            {
            @Override
            public void onFailure(Call call, IOException e) 
            {
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException
            {
            }
        });

        */
            if(response.isSuccessful())
            {
                byte [] data;
                try
                {
                    data = revStream(response.body().byteStream());
                    //response.body().byteStream()获取的是InputStream对象
                    String json = new String(data);//把字符串组转换成字符串
                    Log.v("Json",json);
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
            }
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
    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();
    }
}

服务端,代码几乎一样,需要先将获得的json数据转换成数组,通过键名获取对应值

<?php


header("Content-type: text/html; charset=utf-8");
// 连主库
$db = mysql_connect(SAE_MYSQL_HOST_M.':'.SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS);

mysql_select_db(SAE_MYSQL_DB,$db);

$post_array = file_get_contents('php://input');


var_dump($_REQUEST);

if(empty($post_array))
{
    echo "post过来的数据为空";
}

else
{
    echo "post过来的数据不是空的"."<br/>";

    $obj=json_decode($post_array,TRUE);//true 表示转换成数组

    echo $obj['name'];
    echo $obj['password'];

    $order_id = $obj['name'];
    $password = $obj['password'];
    $sql4 = "insert into table(name,password) values('$order_id','$password')";
    mysql_query($sql4);
}
?>

结果如下:
sae数据库:
这里写图片描述
as:
这里写图片描述

第二部分:上传图片:
呐呐,首先是客户端:
布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="select"
        android:onClick="select"/>

    <ImageView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="1"/>
</LinearLayout>

主类:

public class MainActivity extends AppCompatActivity
{
    public static MediaType mediaType = MediaType.parse("image/jpeg;charset=utf-8");
    ImageView imageView;
    private final String IMAGE_TYPE = "image/*";
    private final int imageRequestCode = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = (ImageView)findViewById(R.id.image);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode != RESULT_OK)
        {
            Log.v("Json", "返回错误");
            return;
        }
        Bitmap bitmap = null;
        ContentResolver resolver = getContentResolver();

        if (requestCode == imageRequestCode)
        {
            try
            {
                Uri contentUri = data.getData();
                bitmap = MediaStore.Images.Media.getBitmap(resolver, contentUri);
                imageView.setImageBitmap(bitmap);

                String[] strings = {MediaStore.Images.Media.DATA};
               // Cursor cursor = managedQuery(contentUri, strings, null, null, null);
                Cursor cursor = resolver.query(contentUri, strings, null, null, null);
                int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                cursor.moveToFirst();
                final String path = cursor.getString(column_index);
                Log.v("Json", path);

                new Thread(new Runnable()
                {
                    @Override
                    public void run()
                    {
                        Log.v("Json",path);
                        initData(path);
                    }
                }).start();

            }
            catch (IOException e)
            {
                Log.v("Json", e.toString());
            }
        }
    }
    public void select(View view)
    {
        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.setType(IMAGE_TYPE);
        startActivityForResult(intent,imageRequestCode);
    }
     private  void initData(String filePath)
    {
        OkHttpClient client = new OkHttpClient();
        MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
        builder.addFormDataPart("img", filePath, RequestBody.create(mediaType,new File(filePath)));
        //这里的img就是文件的键名,服务器可以根据这个获取
        MultipartBody requestBody = builder.build();
        //构建请求
        Request request = new Request.Builder()
                .url("***")//地址
                .post(requestBody)//添加请求体
                .build();
        client.newCall(request).enqueue(new Callback()
        {
            @Override
            public void onFailure(Call call, IOException e)
            {
                Log.v("Json","上传失败");
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException
            {
                try
                {
                    Log.v("Json","上传成功" + new String(revStream(response.body().byteStream())));
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }

            }
        });
    }
}

或者使用 client.newCall(request).execute(); 如果response.isSuccessful,则提取返回内容

服务端:

首先需要在新浪云新建一个 storage,建立一个存储,这里名字为“qxmb”,下面会用到,不过我觉得也可以使用七牛,免费
新浪云代码如下,使用 PHP写的:

<?php


    if(empty($_FILES['img']))
    {   
        //img是指定键名
        echo "是空的";
    }
    else
    {
        echo "不是空的";
    }


    $i = 1;

    $s2 = new SaeStorage();

    foreach ( $_FILES as $file ) 
    {

        if ($file ['error'] > 0) 
        {
            echo 'Error:', $file ['error'], '<br/>';
        }

        else 
        {
            $filename = $file ['name'];

            $s2->upload ( 'qxmb', $file ['name'], $file ['tmp_name'] );
            //这里的qxmb就是刚刚建的
            $url = $s2->getUrl ( "qxmb", $file ['name'] );

            echo "<p>文件 $i</p>";
            if (($file ['type'] == "image/gif") || ($file ['type'] == "image/jpeg") || ($file ['type'] == "image/png")) 

            {
                echo "<p><img src=\"$url\" alt=\"\"/></p>";
            } 

            else 
            {
                echo "<p>文件下载:<a href=\"$url\" download=\"$filename\">$filename</a></p>";
            }

            echo "<hr>";

            $i++;
        }
    }
    echo "haha";
?>

注意,如果不是带头文件上传图片,用$_FILES是接收不到的,要使用 file_get_contents('php://input'),可以直接使用 $_FILES获取所有图片文件,或者使用 $_FILES['name'],获取指定的图片
结果如下:
这里写图片描述
这里写图片描述

Android使用 OkHttp 进行数据请求可以在 Fragment 中按照以下步骤进行: 1. 首先,在你的项目中添加 OkHttp 的依赖。在你的 app 级别的 build.gradle 文件中添加以下代码: ```groovy implementation 'com.squareup.okhttp3:okhttp:<version>' ``` 请将 `<version>` 替换为你想要使用OkHttp 版本号。 2. 在你的 Fragment 类中创建一个 OkHttp 的实例,并在需要发送请求的地方使用它。你可以在 Fragment 的 `onCreateView()` 方法中创建一个 OkHttp 实例,如下所示: ```java public class YourFragment extends Fragment { private OkHttpClient client; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 创建 OkHttp 实例 client = new OkHttpClient(); // 其他代码... } // 其他方法... } ``` 3. 在需要发送请求的地方,使用 OkHttp 的 `newCall()` 方法创建一个 Call 对象,然后调用 `enqueue()` 方法发送异步请求并处理响应。例如,在 Fragment 中的某个方法中发送 GET 请求: ```java public void fetchData() { String url = "http://your-api-url.com/data"; Request request = new Request.Builder() .url(url) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) throws IOException { // 处理响应数据 String responseData = response.body().string(); // 在 UI 线程中更新界面 getActivity().runOnUiThread(new Runnable() { @Override public void run() { // 更新界面 } }); } @Override public void onFailure(Call call, IOException e) { // 处理请求失败情况 } }); } ``` 在 `onResponse()` 方法中,你可以获取到服务器返回的数据进行处理。注意,如果你需要更新 UI 界面,你需要在 `runOnUiThread()` 方法中执行相关操作,以确保在 UI 线程上更新。 这样,你就可以在 Fragment 中使用 OkHttp 进行数据请求了。记得在 Fragment 销毁时释放 OkHttp 实例,以免造成资源泄漏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值