[android] Android에서 요청을 통해 JSON 개체를 보내는 방법은 무엇입니까?

다음 JSON 텍스트를 보내고 싶습니다.

{"Email":"aaa@tbbb.com","Password":"123456"}

웹 서비스에 연결하고 응답을 읽습니다. JSON을 읽는 방법을 알고 있습니다. 문제는 위의 JSON 객체를 변수 이름으로 보내야한다는 것 jason입니다.

Android에서 어떻게 할 수 있습니까? 요청 객체 생성, 콘텐츠 헤더 설정 등과 같은 단계는 무엇입니까?



답변

Android에는 HTTP 송수신을위한 특수 코드가 없으므로 표준 Java 코드를 사용할 수 있습니다. Android와 함께 제공되는 Apache HTTP 클라이언트를 사용하는 것이 좋습니다. 다음은 HTTP POST를 보내는 데 사용한 코드 스 니펫입니다.

“jason”이라는 변수로 개체를 보내는 것이 어떤 것과 관련이 있는지 이해하지 못합니다. 서버가 정확히 무엇을 원하는지 잘 모르겠다면 어떤 형식이 필요한지 알 때까지 다양한 문자열을 서버에 보내는 테스트 프로그램을 작성하는 것이 좋습니다.

int TIMEOUT_MILLISEC = 10000;  // = 10 seconds
String postMessage="{}"; //HERE_YOUR_POST_STRING.
HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, TIMEOUT_MILLISEC);
HttpConnectionParams.setSoTimeout(httpParams, TIMEOUT_MILLISEC);
HttpClient client = new DefaultHttpClient(httpParams);

HttpPost request = new HttpPost(serverUrl);
request.setEntity(new ByteArrayEntity(
    postMessage.toString().getBytes("UTF8")));
HttpResponse response = client.execute(request);


답변

Apache HTTP Client를 사용하면 Android에서 json 객체를 쉽게 보낼 수 있습니다. 이를 수행하는 방법에 대한 코드 샘플은 다음과 같습니다. UI 스레드를 잠그지 않도록 네트워크 활동에 대한 새 스레드를 만들어야합니다.

    protected void sendJson(final String email, final String pwd) {
        Thread t = new Thread() {

            public void run() {
                Looper.prepare(); //For Preparing Message Pool for the child Thread
                HttpClient client = new DefaultHttpClient();
                HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); //Timeout Limit
                HttpResponse response;
                JSONObject json = new JSONObject();

                try {
                    HttpPost post = new HttpPost(URL);
                    json.put("email", email);
                    json.put("password", pwd);
                    StringEntity se = new StringEntity( json.toString());
                    se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
                    post.setEntity(se);
                    response = client.execute(post);

                    /*Checking response */
                    if(response!=null){
                        InputStream in = response.getEntity().getContent(); //Get the data in the entity
                    }

                } catch(Exception e) {
                    e.printStackTrace();
                    createDialog("Error", "Cannot Estabilish Connection");
                }

                Looper.loop(); //Loop in the message queue
            }
        };

        t.start();
    }

Google Gson 을 사용 하여 JSON을 보내고 검색 할 수도 있습니다 .


답변

public void postData(String url,JSONObject obj) {
    // Create a new HttpClient and Post Header

    HttpParams myParams = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(myParams, 10000);
    HttpConnectionParams.setSoTimeout(myParams, 10000);
    HttpClient httpclient = new DefaultHttpClient(myParams );
    String json=obj.toString();

    try {

        HttpPost httppost = new HttpPost(url.toString());
        httppost.setHeader("Content-type", "application/json");

        StringEntity se = new StringEntity(obj.toString());
        se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
        httppost.setEntity(se);

        HttpResponse response = httpclient.execute(httppost);
        String temp = EntityUtils.toString(response.getEntity());
        Log.i("tag", temp);


    } catch (ClientProtocolException e) {

    } catch (IOException e) {
    }
}


답변

HttpPostAndroid Api 레벨 22에서 더 이상 사용되지 않습니다 HttpUrlConnection.

public static String makeRequest(String uri, String json) {
    HttpURLConnection urlConnection;
    String url;
    String data = json;
    String result = null;
    try {
        //Connect 
        urlConnection = (HttpURLConnection) ((new URL(uri).openConnection()));
        urlConnection.setDoOutput(true);
        urlConnection.setRequestProperty("Content-Type", "application/json");
        urlConnection.setRequestProperty("Accept", "application/json");
        urlConnection.setRequestMethod("POST");
        urlConnection.connect();

        //Write
        OutputStream outputStream = urlConnection.getOutputStream();
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
        writer.write(data);
        writer.close();
        outputStream.close();

        //Read
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));

        String line = null;
        StringBuilder sb = new StringBuilder();

        while ((line = bufferedReader.readLine()) != null) {
            sb.append(line);
        }

        bufferedReader.close();
        result = sb.toString();

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return result;
}


답변

아래 링크에는 놀랍도록 멋진 Android HTTP 용 라이브러리가 있습니다.

http://loopj.com/android-async-http/

간단한 요청은 매우 쉽습니다.

AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {
    @Override
    public void onSuccess(String response) {
        System.out.println(response);
    }
});

JSON을 보내려면 ( https://github.com/loopj/android-async-http/issues/125 에서`voidberg ‘에 대한 크레딧 ) :

// params is a JSONObject
StringEntity se = null;
try {
    se = new StringEntity(params.toString());
} catch (UnsupportedEncodingException e) {
    // handle exceptions properly!
}
se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));

client.post(null, "www.example.com/objects", se, "application/json", responseHandler);

모두 비동기식이며 Android에서 잘 작동하며 UI 스레드에서 안전하게 호출 할 수 있습니다. responseHandler는 생성 한 동일한 스레드 (일반적으로 UI 스레드)에서 실행됩니다. JSON에 대한 내장 resonseHandler도 있지만 Google gson을 사용하는 것을 선호합니다.


답변

이제는 HttpClient더 이상 사용되지 않으므로 현재 작업 코드는를 HttpUrlConnection사용하여 연결을 만들고 연결에서 읽고 쓰는 것입니다. 하지만 저는 Volley를 선호했습니다 . 이 라이브러리는 Android AOSP에서 가져온 것입니다. 내가하기 위해 사용하는 매우 쉽게 발견 JsonObjectRequest또는JsonArrayRequest


답변

이것보다 간단 할 수는 없습니다. OkHttpLibrary 사용

JSON 만들기

JSONObject requestObject = new JSONObject();
requestObject.put("Email", email);
requestObject.put("Password", password);

이렇게 보내주세요.

OkHttpClient client = new OkHttpClient();

RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
            .addHeader("Content-Type","application/json")
            .url(url)
            .post(requestObject.toString())
            .build();

okhttp3.Response response = client.newCall(request).execute();