通过WCF和Android的JSON对象
以下是客户端AndroidMainActivity.java文件:通过WCF和Android的JSON对象,android,json,wcf,parsing,post,Android,Json,Wcf,Parsing,Post,以下是客户端AndroidMainActivity.java文件: import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.ht
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import org.apache.http.HttpResponse;
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.JSONException;
import org.json.JSONStringer;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.e("oncreate ", "girdi");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EditText username = (EditText) findViewById(R.id.usernameEditText);
final EditText password = (EditText) findViewById(R.id.passwordEditText);
Button sendBtn = (Button) findViewById(R.id.sendBtn);
sendBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
HttpPost request = new HttpPost("http://10.0.2.2:8732/Design_Time_Addresses/MyWCFSolution/Service1/Check");
request.setHeader("Accept", "application/json");
request.setHeader("Content-type", "application/json");
// Build JSON string
JSONStringer userJson=null;
try {
userJson = new JSONStringer()
.object()
.key("user")
.object()
.key("Username").value(username.getText().toString())
.key("Password").value(password.getText().toString())
.key("Name").value(password.getText().toString())
.endObject()
.endObject();
Log.e("json", "json created");
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
StringEntity entity=null;
try {
entity = new StringEntity(userJson.toString(),"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
entity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
entity.setContentType("application/json");
request.setEntity(entity);
// Send request to WCF service
DefaultHttpClient httpClient = new DefaultHttpClient();
try {
Log.e("response", "connect");
HttpResponse response = httpClient.execute(request);
Log.e("response","response get"+response.toString());
//System.out.println(response.toString());
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
String json = reader.readLine();
Log.e("json string","test "+json.toString()+" lazım");
System.out.println(json);
//JSONTokener tokener = new JSONTokener(json);
//JSONArray finalResult = new JSONArray(tokener);
}catch (Exception e){
e.printStackTrace();
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
服务器端:
App.config:
IService.cs:
User.cs:
opUser.cs:
以下是Eclipse中运行Android应用程序的日志:
01-11 22:50:43.344:E/oncreate(457):girdi
01-11 22:50:48.955:W/KeyCharacterMap(457):id 0没有键盘
01-11 22:50:48.955:W/KeyCharacterMap(457):使用默认keymap:/system/usr/keychars/qwerty.kcm.bin
01-11 22:50:50.935:E/json(457):json已创建
01-11 22:50:50.944:E/应答(457):连接
01-11 22:50:51.164:E/response(457):response getorg.apache.http.message。BasicHttpResponse@405722d0
01-11 22:50:51.174:W/System.err(457):java.lang.NullPointerException
01-11 22:50:51.184:W/System.err(457):位于com.example.logapp.MainActivity$1.onClick(MainActivity.java:95)
01-11 22:50:51.184:W/System.err(457):在android.view.view.performClick(view.java:2485)上
01-11 22:50:51.184:W/System.err(457):在android.view.view.onKeyUp上(view.java:4257)
01-11 22:50:51.184:W/System.err(457):位于android.widget.TextView.onKeyUp(TextView.java:4566)
01-11 22:50:51.184:W/System.err(457):在android.view.KeyEvent.dispatch(KeyEvent.java:1280)上
01-11 22:50:51.184:W/System.err(457):在android.view.view.dispatchKeyEvent(view.java:3855)上
01-11 22:50:51.184:W/System.err(457):在android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)上
01-11 22:50:51.184:W/System.err(457):在android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)上
01-11 22:50:51.184:W/System.err(457):在android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)上
01-11 22:50:51.194:W/System.err(457):在android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:789)上
01-11 22:50:51.194:W/System.err(457):位于com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1687)
01-11 22:50:51.194:W/System.err(457):位于com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1120)
01-11 22:50:51.194:W/System.err(457):在android.app.Activity.dispatchKeyEvent(Activity.java:2073)中
01-11 22:50:51.194:W/System.err(457):位于com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1663)
01-11 22:50:51.194:W/System.err(457):位于android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2560)
01-11 22:50:51.194:W/System.err(457):在android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2535)
01-11 22:50:51.204:W/System.err(457):在android.view.ViewRoot.handleMessage(ViewRoot.java:1867)中
01-11 22:50:51.204:W/System.err(457):位于android.os.Handler.dispatchMessage(Handler.java:99)
01-11 22:50:51.204:W/System.err(457):位于android.os.Looper.loop(Looper.java:123)
01-11 22:50:51.204:W/System.err(457):位于android.app.ActivityThread.main(ActivityThread.java:3683)
01-11 22:50:51.204:W/System.err(457):位于java.lang.reflect.Method.invokenactive(本机方法)
01-11 22:50:51.204:W/System.err(457):位于java.lang.reflect.Method.invoke(Method.java:507)
01-11 22:50:51.215:W/System.err(457):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-11 22:50:51.215:W/System.err(457):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-11 22:50:51.215:W/System.err(457):在dalvik.System.NativeStart.main(本机方法)
HTTP正在执行。我的意思是,响应来自服务器,但我无法获取JSON数据。我尝试使用
System.out.print
编写json数据,但没有成功。Http连接正在工作,但无法获取JSON。为什么会这样?我在这个异常上工作了几天,但没有找到。有人知道吗?下面这行的输出是什么
Log.e("response","response get"+response.toString());
。。。只需检查http请求的responseCode,如果responseCode是200,那么就可以了
HttpResponse response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
} else {
Log.e(ParseJSON.class.toString(), "Failed to download file");
}
我相信响应代码可能不同,这就是为什么你看不到json响应的原因响应代码通常是3位代码,我不确定你为什么会得到5位代码。你可以下载一个名为fiddler的工具,分析从android emulator到服务器的所有流量。即使是这个工具也能帮助你找到确切的问题。还有其他解决方案吗?我会努力找出确切的问题。你有关于这个问题的例子吗?下面是你问题的答案(我在问题中写道)org.apache.http.message。BasicHttpResponse@405722d0Are你确定回复代码是什么?您是否在catch块中放置了一些日志,以确保没有异常,以确保我们没有错过。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.ServiceModel.Web;
namespace MyWCFSolution
{
[ServiceContract]
public interface IService1
{
[OperationContract]
string CheckSQL(User user);
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
namespace MyWCFSolution
{
public class User
{
private Int64 _AutoID;
private string _Username;
private string _Password;
private string _Name;
private string _Surname;
public Int64 AutoID { get { return _AutoID; } set { _AutoID = value; } }
public string Username { get { return _Username; } set { _Username = value; } }
public string Password { get { return _Password; } set { _Password = value; } }
public string Name { get { return _Name; } set { _Name = value; } }
public string Surname { get { return _Surname; } set { _Surname = value; } }
}
public class UserList : CollectionBase
{
public User this[int index]
{
get { return this.List[index] as User; }
}
public void Add(User obj)
{
this.List.Add(obj);
}
public int IndexOf(User obj)
{
return this.List.IndexOf(obj);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;
namespace MyWCFSolution
{
public class opUser
{
public User GetUser(User UserD)
{
UserList Result = new UserList();
System.Data.SqlClient.SqlConnection conn = Connection.ConnectToSql();
User temp = new User();
try
{
conn.Open();
SqlCommand sqlCommSelect = new SqlCommand("dbo.spSelectUserByPassword", conn);
sqlCommSelect.CommandType = CommandType.StoredProcedure;
SqlParameter[] sqlParams = new SqlParameter[] {
new SqlParameter("@Username",UserD.Username ),
new SqlParameter("@Password",UserD.Password )
};
sqlCommSelect.Parameters.AddRange(sqlParams);
SqlDataReader dr = sqlCommSelect.ExecuteReader();
while (dr.Read())
{
temp.Name = Convert.ToString(dr["Name"]);
temp.Surname = Convert.ToString(dr["Surname"]);
}
dr.Close();
conn.Close();
}
catch (Exception exx)
{
conn.Close();
Result = null;
}
return temp;
}
}
}
Log.e("response","response get"+response.toString());
HttpResponse response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
} else {
Log.e(ParseJSON.class.toString(), "Failed to download file");
}