2016-05-24 7 views
1

HttpUrlConnectionクラスを使用してJSONオブジェクトをパラメータ本体としてPOSTリクエストを送信できません。私は同じ質問のためにそう周囲を見てきました、私は解決を試みたが、それらのどれも私の場合のために働く。これは、(私はAsyncTaskクラスでこのメソッドを呼び出す)私のコードです: `jsonをwebserviceにポストするときにAndroidがnullパラメータを送信する

public JSONObject postData(String url, JSONObject params) throws IOException{ 
    JSONObject ret=null; 
    OutputStream os=null; 
    InputStream is=null; 
    HttpURLConnection cnHost=null; 
    URL host=null; 
    String jsStr=null; 
    StringBuilder result=null; 
    String json=""; 

    try { 

     //TODO Open host connection 
     host = new URL(url); 
     jsStr = "key="+params; 
     cnHost = (HttpURLConnection) host.openConnection(); 

     //TODO set request Attribute 
      //Set Connection attributes 
      cnHost.setDoInput(true); 
      cnHost.setDoOutput(true); 
      cnHost.setUseCaches (false); 
      cnHost.setAllowUserInteraction(false); 
      cnHost.setReadTimeout(10000); 
      cnHost.setConnectTimeout(15000); 
      cnHost.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;"); 
      cnHost.setRequestMethod("POST"); 

     //TODO Start streaming request 
     cnHost.connect(); 

     os =cnHost.getOutputStream(); 
     BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(os)); 
     wr.write(jsStr); 
     wr.flush(); 
     wr.close(); 

     //TODO get Response 
     try { 
       BufferedInputStream in = new BufferedInputStream(cnHost.getInputStream()); 
       BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
       result = new StringBuilder(); 
       String line; 
       while ((line = reader.readLine()) != null) { 
        result.append(line); } 

       //TODO cast to json Object 
       json = result.toString(); 
       in.close(); 
       reader.close(); 

       ret = new JSONObject(json); 
     } catch (Exception e){ 
      Log.d("Get_response","inner_Exception"); 
      e.printStackTrace(); 
     } 



    }catch (IOException e) { 
     //TODO Add IOException Handler 
     Log.d("IOException", "Descp:"); 
     e.printStackTrace(); 
    }catch (NullPointerException e){ 
     //TODO Add NUllPointerException 
     Log.d("NullPointerException","Descp:"); 
     e.printStackTrace(); 
    } catch (Exception e){ 
     //TODO Add Exception Handler 
     Log.d("Exception","Descp"); 
     e.printStackTrace(); 
    } finally { 

     //region Log postData (removed when no bug) 
      Log.d("bodyContent:", jsStr); 
      Log.d("RequestMethod", cnHost.getRequestMethod()); 
      Log.d("DoInput", String.valueOf(cnHost.getDoInput())); 
      Log.d("DoOutput", String.valueOf(cnHost.getDoOutput())); 
      Log.d("FixLengthStreamMode", String.valueOf(jsStr.getBytes().length)); 
      Log.d("Content-Type", cnHost.getRequestProperty("Content-Type")); 
      Log.d("Response_Message",json); 
     //endregion 
     cnHost.disconnect(); 
    } 

    return ret; 
} ` 

以下は上記のメソッドを呼び出す私のコードです:

try{ 
    JSONObject jsParam=new JSONObject(); 
jsParam.put("method", URLEncoder.encode("check","UTF-8")); 

JSONObject jsResponse=postData(myUrl,jsParam); 
} catch (Exception e){ 
    e.printStackTrace; 
} finally{ 
    if(jsObj==null){ 
      Log.d("NullJson","Yes, jsObj return null"); 
     } else { 
      Log.d("ValidResponse",jsObj.toString()); 
     } 
} 

アンドロイドアプリからこの要求のポスト、前記要求本体が含むウェブサービスの常時応答はヌルメッセージである。しかし、私がPostman-clientを使って送るとき、有効なメッセージでWebサービスの応答。私のポストマンコードの下には:

POST /mro/public/index.php? HTTP/1.1 
Host: mro.alfamartku.com 
Content-Type: application/x-www-form-urlencoded; 
Cache-Control: no-cache 
Postman-Token: 25463d97-b821-7016-d3e7-5e256d69a31a 

key={"method":"check"} 
+0

logcatエラーを投稿する –

+0

アプリケーションでエラーが発生しませんでした。アプリの成功はWebサービスへのリクエストをポストしますが、無効なメッセージ(私の場合はポストボディがヌル文字列です)を返し、「間違った方法」と答えます。そして、私の郵便体は、APIのドキュメンテーションに従って、まったく同じです。私はすでにチェックして、新しい改行文字が投稿に含まれていないことを確認しました。 – dsugi

答えて

1
​​

あなたは逃した部分は、以下の...すなわち、次のように...

// Send POST output. 
printout = new DataOutputStream(urlConn.getOutputStream()); 
printout.write(URLEncoder.encode(jsonParam.toString(),"UTF-8")); 
printout.flush(); 
printout.close(); 

あなたがそれを行うことができますものの残りの部分であります。

+0

あなたのコードとPost-manクライアントのコード生成結果を比較した後。 .setRequestProperty( "Host"、 "someHostName"); 'という部分は見逃しています。ありがとうございましたあなたのソリューションは、それは私のために働いています。 – dsugi

+0

uあなたは間違っていると思われます。本当にいい仕事です。 –

+0

サンプルコードありがとうございます。 – dsugi

関連する問題