2013-05-08 66 views
0

我想發送一個webservice方法,將鋸齒狀數組作爲參數。我構建數組,但它總是將null傳遞給Web服務。將參數發送到.net從Android的Restful WebService

這裏是我的java類:

package com.mitch.wcfwebserviceexample; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.StringEntity; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicHeader; 
import org.apache.http.protocol.HTTP; 
import org.json.JSONArray; 
import org.json.JSONObject; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
import android.app.Activity; 

public class MainActivity extends Activity implements OnClickListener { 
    private String values =""; 
    Button btn; 
    TextView tv; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     btn = (Button)this.findViewById(R.id.btnAccess); 
     tv = (TextView)this.findViewById(R.id.tvAccess); 
     btn.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View arg0) { 
     try 
     { 
     AsyncTaskExample task = new AsyncTaskExample(this); 
     task.execute(""); 
     String test = values; 
     tv.setText(values); 
     } catch(Exception e) 
     { 
      Log.e("Click Exception ", e.getMessage()); 
     } 

    } 

    public class AsyncTaskExample extends AsyncTask<String, Void,String> 
    { 
     private String Result=""; 
     //private final static String SERVICE_URI = "http://10.0.2.2:1736"; 
     private final static String SERVICE_URI = "http://10.0.2.2:65031/SampleService.svc"; 
     private MainActivity host; 
     public AsyncTaskExample(MainActivity host) 
     { 
      this.host = host; 
     } 

     public String GetSEssion(String URL) 
     { 
      boolean isValid = true; 
      if(isValid) 
      { 

        String[][] val = { 
         new String[] {"Student.ID","123456"}, 
         new String[] {"Student.username","user1"}, 
         new String[] {"Student.password","123456"}, 
         new String[] {"Student.location.id","12"} 
        }; 
        HttpPost requestAuth = new HttpPost(URL +"/Login"); 
        try 
        { 
        JSONObject json = new JSONObject(); 
       // json.put("sessionId", sessionId); 
        JSONArray params = new JSONArray(); 
        params.put(val); 
        json.put("authenParams", params); 

        StringEntity se = new StringEntity(json.toString()); 
        se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json")); 
        requestAuth.setHeader("Accept","application/json"); 
        requestAuth.setEntity(se); 
        DefaultHttpClient httpClientAuth = new DefaultHttpClient(); 
        HttpResponse responseAuth = httpClientAuth.execute(requestAuth); 
        HttpEntity responseEntityAuth = responseAuth.getEntity(); 
        char[] bufferAuth = new char[(int)responseEntityAuth.getContentLength()]; 
        InputStream streamAuth = responseEntityAuth.getContent(); 
        InputStreamReader readerAuth = new InputStreamReader(streamAuth); 
        readerAuth.read(bufferAuth); 
        streamAuth.close(); 
        String rawAuthResult = new String(bufferAuth); 
        Result = rawAuthResult; 
        String d = null; 
     //  } 
      } catch (ClientProtocolException e) { 
       Log.e("Client Protocol", e.getMessage()); 
      } catch (IOException e) { 
       Log.e("Client Protocol", e.getMessage()); 
      } catch(Exception e) 
      { 
       Log.e("Client Protocol", e.getMessage()); 
      } 
      } 
      return Result; 
     } 

     @Override 
     protected String doInBackground(String... arg0) { 
      android.os.Debug.waitForDebugger(); 
      String t = GetSEssion(SERVICE_URI); 
      return t; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
     // host.values = Result; 
      super.onPostExecute(result); 
     } 
     @Override 
     protected void onPreExecute() { 
      // TODO Auto-generated method stub 
      super.onPreExecute(); 
     } 

     @Override 
     protected void onCancelled() { 
      // TODO Auto-generated method stub 
      super.onCancelled(); 
     } 
    } 
} 

下面是我的方法是應該收到的參數: 我把一個破發點中的代碼下面進行檢查。該參數始終爲空。

public string Login(string[][] value) 
     { 
      string[] tester = null; 
      string testerExample=""; 
      foreach (string[] st in value) 
      { 
       tester = st; 
      } 

      foreach (string dt in tester) 
      { 
       testerExample = dt; 
      } 

      return testerExample; 
     } 

這裏是IStudentService方法聲明:

[OperationContract] 
     [WebInvoke(
      Method="POST", UriTemplate="Login", BodyStyle= WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)] 
     string Login(string[][] value); 

我想如你所說,並沒有奏效。它返回「請求錯誤」 這裏是我粘貼的示例代碼。

HttpClient client = new DefaultHttpClient(); 
      HttpPost post = new HttpPost("http://10.0.2.2:65031/SampleService.svc/login"); 
List<NameValuePair> pairs = new ArrayList<NameValuePair>(); 
pairs.add(new BasicNameValuePair("tester","abcd")); 
pairs.add(new BasicNameValuePair("sampletest","1234")); 
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(pairs,HTTP.UTF_8); 
post.setEntity(entity); 
HttpResponse response = client.execute(post); 
HttpEntity responseEntity = response.getEntity();    
char[] buffer = new char[(int)responseEntity.getContentLength()];   
InputStream stream = responseEntity.getContent();   
InputStreamReader reader = new InputStreamReader(stream);   
reader.read(buffer);  stream.close();   
String value = new String(buffer); 
+0

爲什麼你使用'StringEntity'?使用'UrlEncodedFormEntity',它更好。 – vorrtex 2013-05-08 15:24:47

+0

我按照你的建議做了,它對我沒有用。它返回請求錯誤。 – 2013-05-08 18:47:35

+0

嘗試使用Fiddler應用程序撰寫http請求。雖然我不認爲有可能調用一個將'string [] [] value'作爲參數的服務。你應該用'string Login(string tester,string sampletest)'來代替它。 – vorrtex 2013-05-08 20:05:50

回答

0

我改變了網絡服務合同,XML,以及UrlEncodedFormEntity仍然無法正常工作。

public interface SampleService 
    { 
     [OperationContract] 
     [WebInvoke(
      Method="POST", UriTemplate="/Login", ResponseFormat = WebMessageFormat.Xml, RequestFormat = WebMessageFormat.Xml)] 
     string Login(List<String> value); 
    } 
+0

嘗試再次使用StringEntity,並完全像這樣創建它'new StringEntity(「[\」str1 \「,\」str2 \「]」)''。然後檢查它是否被接受。 – vorrtex 2013-05-09 16:55:26

+0

OMG ....它的工作原理......它的工作原理......它的工作原理......這是否意味着我構建字符串的方式導致了這個問題? – 2013-05-09 17:09:36

+0

是的,也許正因爲如此,'JSONObject'類沒有像它應該那樣工作。所以你應該檢查一下'json.toString()'返回的是否在邏輯上是正確的。二維數組應該看起來像'[[\「str1 \」,...其他值...]]。如果您使用1維數組,它應該包含您已經看到的單個括號。 – vorrtex 2013-05-09 17:16:46

0

我終於按照他們希望的方式工作了。問題在於我以這種方式構建數組(請參見下面的第1節)並將其傳遞給JSONObject或JSONArray。我使用JSONArray切換並構建數組,並將其傳遞給JSONObject(請參閱第2節)。它像一個魅力。

  • SECTION1: 錯誤的方式做到這一點 - (它可能以這種方式工作,如果你是通過數組來看看,並把它們放在一個JSONArray這將是工作太多的時候,可以直接完成。 )

    String[][] Array = { 
    new String[]{"Example", "Test"}, 
    new String[]{"Example", "Test"}, 
    }; 
    
    JSONArray jar1 = new JSONArray(); 
    jar1.put(0, Array); **// Did not work** 
    
  • 第2部分: 我做了很長時間的努力和@vorrtex一些非常有用的提示和提示後的方式。

    JSONArray jar1 = new JSONArray(); 
    jar1.put(0, "ABC"); 
    jar1.put(1, "Son"); 
    jar1.put(2, "Niece"); 
    
    JSONArray jarr = new JSONArray(); 
    jarr.put(0, jar1); 
    
    JSONArray j = new JSONArray(); 
    j.put(0,"session"); 
    
    JSONObject obj = new JSONObject();   
    obj.put("value", jarr); 
    obj.put("test", j); 
    obj.put("name","myName"); 
    Log.d("Obj.ToString message: ",obj.toString()); 
    StringEntity entity = new StringEntity(obj.toString()); 
    

縱觀Web服務,它具有正是我一直在尋找。

謝謝你的幫助!

+0

好的,請將您自己的答案標記爲已接受。 – vorrtex 2013-05-09 21:33:04

相關問題