2014-01-18 15 views
6

GETメソッドを使用してサーバーにデータを送信しようとしましたが、その方法を見つけることができません。私は非同期タスクでいくつかのコードを試したが、何もしなかった。 Webサービスは、CakePHPで作られており、フォーマットはこのようなものです:GETメソッドで値を送信

Base_URI/users/add.json?json={“email”: [email protected], “password”: “xxxxxxxxx”, “first_name”: “Xyz”, “last_name”: “Xyz”} 

Androidの専門家は、この問題から抜け出す道を把握するように要求されています。おかげ

ここでは、コードされた:URLのこの形式を

List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
      nameValuePairs.add(new BasicNameValuePair("email", UserDummy.email)); 
      nameValuePairs.add(new BasicNameValuePair("password", UserDummy.password)); 
      nameValuePairs.add(new BasicNameValuePair("first_name", UserDummy.fname)); 
      nameValuePairs.add(new BasicNameValuePair("last_name", UserDummy.lname)); 
      // Making HTTP request 
    try { 

     // check for request method 
     if (method == "POST") { 
      // request method is POST 
      // defaultHttpClient 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(url); 
      httpPost.setEntity(new UrlEncodedFormEntity(params)); 

      HttpResponse httpResponse = httpClient.execute(httpPost); 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      is = httpEntity.getContent(); 

     } else if (method == "GET") { 
      // request method is GET 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      String paramString = URLEncodedUtils.format(params, HTTP.UTF_8); 
      url += "?json={" + paramString+"}";                                      ; 
      HttpGet httpGet = new HttpGet(url); 

      HttpResponse httpResponse = httpClient.execute(httpGet); 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      is = httpEntity.getContent(); 
     } 

    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
     Log.v("XXX", e.getMessage()); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
     Log.v("XXX", e.getMessage()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     Log.v("XXX", e.getMessage()); 
    } 

    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       is, "iso-8859-1"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
     is.close(); 
     json = sb.toString(); 
    } catch (Exception e) { 
     Log.e("Buffer Error", "Error converting result " + e.toString()); 
    } 

    // try parse the string to a JSON object 
    try { 
     jObj = new JSONObject(json); 
    } catch (JSONException e) { 
     Log.e("JSON Parser", "Error parsing data " + e.toString()); 
    } 

    // return JSON String 
    return jObj; 

HTTPGET受け付けていませんし、エラーを与えているが、私は、ブラウザ上でそれをしようとすると、それが正常に動作します。エラーは次のとおりです。

Illegal character in query at index 56 
+1

あなたのコードを投稿してください...それを解決するのに役立ちます – petey

+1

GETパラメータとしてJSONを使用してください。通常の名前と値のペアで何が問題なのですか。また、JSONをbase64にエンコードする必要があります。最後に、GETリクエストには255文字の制限があると思いますが、それについて私を引用しません。 –

+0

また、サーバーの実装を開発しているのであれば、私は気にしませんが、GETリクエストで電子メールとパスワードを送信しないことをお勧めします。両方のパラメータを暗号化してPOSTすることは、より安全な方法です。 –

答えて

3

で最後に全体の日別のソリューションをデバッグして試した後、私はこの問題を解決:)

私は、パラメータの一部を符号化するために必要なこのようなURL全体ではありません。

String url = "Base_URI/users/add.json?json="; 
    url =url + URLEncoder.encode("{\"email\":\""+email+"\",\"password\":\""+password+"\"}", "UTF-8"); 

お世話になりました!

0

Androidでネットワーキングするには、volley libを使用してください。

+1

ここにサードパーティライブラリを使用する必要はありません。 Androidには、OPが望んでいることをするために必要なものすべてがすでに組み込まれている 'org.apache.http'パッケージが組み込まれています。 –

+0

ボレーは、アンドロイドのより最新のネットワークです。そしてそれは非常に単純な –

+0

多分、それはあなたのアプリに不要な重さを追加します。これは組み込みメソッドを使用することができます。 –

0

あなたの文字列の比較は正しくありません。

このオブジェクト参照を比較し、あなたのために動作しません。Intead

method == "POST" 

、(等号を使用):

"POST".equals(method); 

あなたはまた、行うことができます。

method.equals("POST"); 

が、そのmethodがnullの場合はエラーが発生する可能性があります。

+0

これは問題ではありません。その完璧に動作します。ここの問題は、GETメソッド – Shahzeb

+0

によって与えられたURLからjsonをパースしています。投稿したコードによれば、 "is"はnullになります。決して設定されません。 HTTPメソッドは選択されません。あなたの他のメッセージのエラーログはそれを確認します。解析に問題がある場合は、nullを解析しているためです。 – MikeHelland

0

あなたがメソッドのGETを使用する場合:

この方法は、右ここであなた

/** 
* 
* @param url stands for API 
* @param 
*  params[i][0] stands for column's name 
*  params[i][1] stands for value which respective with column's name 
* @return InputStream which got from Server 
*/ 
public static int sendJSONObject(IGetUserData iUserId, String method, String url, String[]... params) { 
    InputStream mInputStream = null; 
    HttpClient mHttpClient = null; 
    HttpRequestWithEntity mHttpGet = null; 
    int status = Def.REQUEST_INVALID; 
    try { 
     mHttpClient = new DefaultHttpClient(); 

     mHttpGet = new HttpRequestWithEntity(url, method); 

     JSONObject mObject = new JSONObject(); 
     for (String[] pair : params) { 
      mObject.put(pair[0], pair[1]); 
     } 

     StringEntity mStringEntity = new StringEntity(mObject.toString()); 
     mStringEntity.setContentEncoding("UTF-8"); 
     mStringEntity.setContentType("application/json"); 

     mHttpGet.setEntity(mStringEntity);   
     HttpResponse mResponse = mHttpClient.execute(mHttpGet); 
     status = mResponse.getStatusLine().getStatusCode(); 

     Log.d(TAG, "status: " + status); 
     if (mResponse != null && 
       (status == Def.CREATED || status == Def.OK)) { 
      mInputStream = mResponse.getEntity().getContent(); 
      if(mInputStream != null){ 
       String json = StreamUtils.converStreamToString(mInputStream); 
       userId = JSONUtils.getUserId(json); 
       iUserId.sendUserId(userId); 
       Log.d("viet","userid = " + userId); 
      } 
     } 

    } catch (Exception e) { 
     Log.e(TAG, "Error during send"); 
     status = Def.NETWORK_ERROR; 
    } 
    return status; 
} 

役立つことは何が必要です。

mHttpClient = new DefaultHttpClient(); 

    mHttpGet = new HttpRequestWithEntity(url, method); 

    JSONObject mObject = new JSONObject(); 
    for (String[] pair : params) { 
     mObject.put(pair[0], pair[1]); 
    } 

    StringEntity mStringEntity = new StringEntity(mObject.toString()); 
    mStringEntity.setContentEncoding("UTF-8"); 
    mStringEntity.setContentType("application/json"); 

    mHttpGet.setEntity(mStringEntity);   
    HttpResponse mResponse = mHttpClient.execute(mHttpGet); 

そしてここHttpRequestWithEntity.java

import java.net.URI; 
import java.net.URISyntaxException; 

import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; 

public class HttpRequestWithEntity extends HttpEntityEnclosingRequestBase { 

    private String method; 

    public HttpRequestWithEntity(String url, String method) { 
     if (method == null || (method != null && method.isEmpty())) { 
      this.method = HttpMethod.GET; 
     } else { 
      this.method = method; 
     } 
     try { 
      setURI(new URI(url)); 
     } catch (URISyntaxException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public String getMethod() { 
     return this.method; 
    } 

} 
+0

'HttpGet'メソッドで' Json'を送ることができるとは思わないので、 –

+0

私にとってはうまくいき、私は自分のプロジェクトで使っていました。 :) 試しましたか? – Luc

+0

これを参照してください:http://stackoverflow.com/questions/6073896/sending-json-object-to-the-server-via-http-get –