Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android JSON POST与OKHTTP_Android_Json_Http_Post_Okhttp3 - Fatal编程技术网

Android JSON POST与OKHTTP

Android JSON POST与OKHTTP,android,json,http,post,okhttp3,Android,Json,Http,Post,Okhttp3,我正在寻找一种解决方案,用OKHTTP实现JSON-POST请求。我有一个HTTP-Client.java文件,它处理所有方法(POST、GET、PUT、DELETE),在RegisterActivity中,我想将JSON格式的用户数据(从输入字段)发布到服务器 这是我的HTTP客户机.java public class HttpClient{ public static final MediaType JSON = MediaType.

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

这是我的HTTP客户机.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;
        }
}
每次启动应用程序时,当我单击“注册”按钮时,它就会崩溃,这是由致命的预期“android.os.NetworkOnMainThreadException”引起的


我已经读过一些关于异步任务的书,但我不知道具体怎么做

这是因为您试图在主线程(或UI线程)上执行HTTP查询。您不应该在主线程上执行长任务,因为您的应用程序将挂起,因为绘图例程是在该线程中执行的(因此他的另一个名称是“UI线程”)。您应该使用另一个线程来提出请求。例如:

new Thread(){
       //Call your post method here. 
    }.start();
Android asynctask是一个执行异步工作的简单类。它首先在调用线程上执行他的“onPreExecute”方法,然后在后台线程上执行他的“doInBackground”方法,然后在调用线程中执行他的“onPostExecute”方法。

试试下面的代码

  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());
            }


    });
MediaType JSON=MediaType.parse(“application/JSON;charset=utf-8”);
Map params=新的HashMap();
参数put(“msisdn”、“123123”);
参数put(“姓名”、“您的姓名”);
JSONObject参数=新的JSONObject(参数);
OkHttpClient=新的OkHttpClient();
RequestBody=RequestBody.create(JSON,parameter.toString());
Request Request=newrequest.Builder()
.url(url)
.职位(机构)
.addHeader(“内容类型”、“应用程序/json;字符集=utf-8”)
.build();
client.newCall(request).enqueue(new Callback()){
@凌驾
公共void onFailure(调用调用,IOE异常){
Log.e(“response”,call.request().body().toString());
}
@凌驾
public void onResponse(调用调用、响应响应)引发IOException{
Log.e(“response”,response.body().string());
}
});

尝试使用改装库向服务器发出Post请求。这提供了到服务器的快速可靠连接。

同样,您也可以使用凌空库。

关于开始,请查看okhttp和GSON的改进。对于高级版本,您可以包括Otto和Dagger2,以将核心业务与前端完全分离。
  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());
            }


    });