Android JSON POST 与 OKHTTP

标签 android json http post okhttp

我正在寻找一种使用 OKHTTP 实现 JSON-POST 请求的解决方案。我有一个 HTTP-Client.java 文件,它处理所有方法(POST、GET、PUT、DELETE),并且在 RegisterActivity 中我想将 JSON 格式的用户数据(来自输入字段)发布到服务器。

这是我的HTTP-Client.java

    public class HttpClient{

        public static final MediaType JSON
                = MediaType.parse("application/json; charset=utf-8");

        public static OkHttpClient client = new OkHttpClient.Builder()
                .cookieJar(new CookieJar() {
                    private final HashMap<String, List<Cookie>> cookieStore = new HashMap<>();

                    @Override
                    public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
                        cookieStore.put(url.host(), cookies);
                    }

                    @Override
                    public List<Cookie> loadForRequest(HttpUrl url) {
                        List<Cookie> cookies = cookieStore.get(url.host());
                        return cookies != null ? cookies : new ArrayList<Cookie>();
                    }
                })
                .build();

        public static Call post(String url, String json, Callback callback) throws IOException {
            RequestBody body = RequestBody.create(JSON, json);

            Request request = new Request.Builder()
                    .url(url)
                    .post(body.create(JSON, json))
                    .build();
            Call call = client.newCall(request);
            call.enqueue(callback);
            return call;
        }
}

...这是 RegisterActivity 中的 onClick-Part

btnRegRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //TODO

                String registerData = "{\"email\":\"" + etRegisterEmail.getText().toString() + "\",\"password\":\"" + etRegisterPasswort.getText().toString() + "\"}";


                try {
                    HttpClient.post(ABSOLUTE_URL, registerData, new Callback(){
                        @Override
                        public void onFailure(Call call, IOException e) {

                        }
                        @Override
                        public void onResponse(Call call, Response response) throws IOException {
                            if (response.isSuccessful()) {
                                String resp = response.body().string();
                                if (resp != null) {
                                    Log.d("Statuscode", String.valueOf(response.code()));
                                    Log.d("Body", response.body().string());
                                }
                            }
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });

每次我启动应用程序时,当我单击“注册按钮”时,它都会因致命期望“android.os.NetworkOnMainThreadException”而崩溃

我已经读过一些有关 AsyncTask 的内容,但我不知 Prop 体如何执行此操作。

最佳答案

尝试下面的代码

  MediaType JSON = MediaType.parse("application/json; charset=utf-8");
        Map<String, String> params = new HashMap<String, String>();
        params.put("msisdn", "123123");
       params.put("name", "your name");
        JSONObject parameter = new JSONObject(param);
        OkHttpClient client = new OkHttpClient();

        RequestBody body = RequestBody.create(JSON, parameter.toString());
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .addHeader("content-type", "application/json; charset=utf-8")
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Log.e("response", call.request().body().toString());

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                  Log.e("response", response.body().string());
            }


    });

关于Android JSON POST 与 OKHTTP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37752718/

相关文章:

android - 带有一些预定义选项的 EditText

json - Azure 数据工厂将 JSON 复制到表中的行

json - 使用反斜杠解析 JSON Node.js

java - 如何在 Android 中解析换行符分隔的 Json 响应?

node.js - 通过 Json 发送到服务器时收到空映射

apache - Apache 服务器端重定向

http - gitsharp 克隆 http 协议(protocol)失败,但 git 协议(protocol)成功!为什么?

java - 在 Android 中捕获 printStackTrace() 输出

android - 库模块依赖与 App 模块依赖

android - 不使用 Intent 切换 Activity