2016-06-10 71 views
2

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

这是我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

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

每次我开始崩溃的应用程序中的onClick - 第一部分当我点击注册按钮造成的致命错误'android.os.NetworkOnMainThreadException'

我已经读了一些关于AsyncTask的内容,但我不知道如何做到这一点。

+0

首先,请使用okhttp和GSON查看Retrofit。对于高级版本,您可以使用Otto和Dagger2将核心业务与前端完全分开。 – bajicdusko

回答

0

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

new Thread(){ 
     //Call your post method here. 
    }.start(); 

Android asynctask是一个简单的类来完成异步工作。它首先在调用线程上执行他的“onPreExecute”方法,然后在后台线程上执行他的“doInBackground”方法,然后在调用线程中执行他的“onPostExecute”方法。

4

尝试以下

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


    }); 
+0

感谢它的完美。 –

+0

作品!感谢代码。 – codemax

0

我的代码尝试使用改造库制作邮政请求到服务器。这提供了与服务器的快速可靠连接。
您也可以使用Volley库。