java - Android studio中POST请求示例

标签 java android rest post get

我几天前才开始学习 android,我在将我的 JSON 数据上传到服务器时遇到了问题。我设法通过以下代码检索它:

编辑:我确实设法使用外部 OKHTTP 库检索文件,但我想在不使用外部库的情况下执行此操作。

package cc.demorest;

import android.os.AsyncTask;
import android.renderscript.ScriptGroup;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
import android.widget.TextView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setContentView(R.layout.activity_main);

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DownloadTask task = new DownloadTask();
        task.execute("myserver.com");
    }
//Downloadtask
    public class DownloadTask extends AsyncTask<String,Void,String> {


        @Override
        protected String doInBackground(String... urls) {

            String result = "";
                URL url;
            HttpURLConnection urlConnection=null;


            try {
                url = new URL(urls[0]);

                urlConnection=(HttpURLConnection)url.openConnection();
                InputStream in = urlConnection.getInputStream();

                InputStreamReader reader = new InputStreamReader(in);

                int data=reader.read();

                while (data !=-1){

                    char current=(char) data;

                    result += current;
                    data = reader.read();
                }

                return result;

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            return null;
        }
//After download task
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
        try {

            JSONArray jArray=new JSONArray(result);
                JSONObject json_data = jArray.getJSONObject(1);
//Logging data
               Log.i("Podatci: ", "Id: " + json_data.getInt("Id") +
                                ", Name: " + json_data.getString("Name") +
                                ", Years: " + json_data.getString("Age") +
                                ", Email address: " + json_data.getString("Email")
                );
                TextView textView = (TextView) findViewById(R.id.textViewName);
                textView.setText("ID: "+", Name: "+  json_data.getInt("Id")+json_data.getString("Name")+json_data.getString("Age")+json_data.getString("Email"));




/*
        String data = jsonObject.getString("Name");
            Log.i("Website content", data);
*/
        } catch (JSONException e) {
            e.printStackTrace();
        }

        }
    }



}

我现在正尝试将我的数据发送到具有相同字段的同一服务器。我搜索了互联网,但我发现的大多数东西都已经过时了。我真的很乐意提供一些帮助或示例。 最好的问候

最佳答案

使用HttpURLConnection,它不使用外部库。如果您要使用 HttpURLConnection,它需要是一个 AsyncTask

这是我完成的项目中的代码。希望对您有所帮助。

首先,将其放入您的 manifest.xml 文件中:

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

调用异步任务:

(忽略this、SinceTime、GoesAddress,它们只是我传入的变量)

    URL url = new URL("https://eddn.usgs.gov/cgi-bin/fieldtest.pl");
    new ReceiveData(this, SinceTime, GoesAddress).execute(url);

类:

package com.ryan.scrapermain;

import android.content.Context;
import android.os.AsyncTask;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;

import javax.net.ssl.HttpsURLConnection;


public class ReceiveData extends AsyncTask<URL, Integer, Long> {

    String response = "";
    String SinceTime;
    String GoesAddress;
    Context myContext;

    ReceiveData(Context context, String since, String goes) {
        this.myContext = context;
        SinceTime = since;
        GoesAddress = goes;
        }

    private String getPostDataString(HashMap<String, String> params) throws UnsupportedEncodingException {
        StringBuilder feedback = new StringBuilder();
        boolean first = true;
        for(Map.Entry<String, String> entry : params.entrySet()){
            if (first)
                first = false;
            else
                feedback.append("&");

            feedback.append(URLEncoder.encode(entry.getKey(), "UTF-8"));
            feedback.append("=");
            feedback.append(URLEncoder.encode(entry.getValue(), "UTF-8"));
        }

        return feedback.toString();
    }

    public void getData() throws IOException {

        HashMap<String, String> params = new HashMap<>();
        params.put("DCPID", GoesAddress);
        params.put("SINCE", SinceTime);

        URL url = new URL("https://eddn.usgs.gov/cgi-bin/fieldtest.pl");
        HttpURLConnection client = null;
        try {
            client = (HttpURLConnection) url.openConnection();
            client.setRequestMethod("POST");
            // You need to specify the context-type.  In this case it is a
            // form submission, so use "multipart/form-data"
            client.setRequestProperty("multipart/form-data", "https://eddn.usgs.gov/fieldtest.html;charset=UTF-8");
            client.setDoInput(true);
            client.setDoOutput(true);

            OutputStream os = client.getOutputStream();
            BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(os, "UTF-8"));
            writer.write(getPostDataString(params));

            writer.flush();
            writer.close();
            os.close();
            int responseCode = client.getResponseCode();

            if (responseCode == HttpsURLConnection.HTTP_OK) {
                String line;
                BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
                while ((line = br.readLine()) != null) {
                    response += line;
                }
            }
            else {
                response = "";
            }
        }
        catch (MalformedURLException e){
            e.printStackTrace();
        }
        finally {
            if(client != null) // Make sure the connection is not null.
                client.disconnect();
        }
    }

    @Override
    protected Long doInBackground(URL... params) {
        try {
            getData();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // This counts how many bytes were downloaded
        final byte[] result = response.getBytes();
        Long numOfBytes = Long.valueOf(result.length);
        return numOfBytes;
    }

    protected void onPostExecute(Long result) {
        System.out.println("Downloaded " + result + " bytes");
        // This is just printing it to the console for now.
        System.out.println(response);
        // In the following two line I pass the string elsewhere and decode it.
        InputCode input = new InputCode();
        input.passToDisplay(myContext, response);
    }
}

关于java - Android studio中POST请求示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35886591/

相关文章:

ios - 来自 ViewController 外部的 Alamofire 请求

c# - REST 服务代理与 WCF SOAP 代理的性能对比

java - 如何统计提问次数?

java - 是否从 MainActivity 和 fragment 复制线程启动服务?

java - 许多 TIME_WAIT 无法获得 ESTABLISHED tcp 连接

Android跨应用数据传递

android - 使用 onDraw 扩展 android 按钮

android - 为什么在 Activity 之间移动时总是执行oncreate?

RESTful 实现和一般信息

java - 尝试获取数据时出现数字格式异常