2012-06-02 3 views
1

У меня есть RESTful службы WCF и один из его методов использования объекта в качестве параметравызова метода RESTful WCFservice с объектом в качестве параметра из Java

[WebInvoke(UriTemplate = "save", Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat= WebMessageFormat.Xml), OperationContract] 
     public SampleItem Create(SampleItem instance) 
     { 
      return new SampleItem() { Id = 1, StringValue = "saved" }; 
      // TODO: Add the new instance of SampleItem to the collection 
      //throw new NotImplementedException(); 
     } 

Я пытаюсь вызвать этот метод из моего затмения андроида проекта. Я использую эти строки кодов

DefaultHttpClient httpClient = new DefaultHttpClient(); 
HttpPost post=new HttpPost("http://10.0.2.2:2768/Service1.svc/save"); 
ArrayList<NameValuePair> nvp= new ArrayList<NameValuePair>(); 

nvp.add(new BasicNameValuePair("Id", "1")); 
nvp.add(new BasicNameValuePair("StringValue", "yolo")); 

post.setEntity(new UrlEncodedFormEntity(nvp)); 
HttpResponse httpResponse = httpClient.execute(post); 
HttpEntity httpEntity = httpResponse.getEntity(); 
String xml = EntityUtils.toString(httpEntity); 

Каждый раз, когда я получаю эту ошибку Method not allowed. в XML, возвращенный метод обслуживания.

Я попытался вызвать его из браузера, но столкнулся с той же ошибкой.

скажите, пожалуйста, что я делаю неправильно и что я могу сделать вместо этого.

благодарит заранее всех, кто может помочь.

примечание: другие методы, которые не используют объект в качестве параметра, работают нормально.

EDIT: попытался Fiddler2 с успехом. но снова заглох.

Я попытался использовать метод SampleItem Create(SampleItem instance) с адресом http://localhost:2768/Service1.svc/save и он работает. метод возвращает объект в формате XML.

в стельку я добавил тело запроса в <SampleItem xmlns="http://schemas.datacontract.org/2004/07/WcfRestService1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Id>1</Id><StringValue>saved</StringValue></SampleItem>

, но проблема в том, что я не могу найти способ, чтобы добавить этот XML-строку в HttpPost или HttpRequest как requestbody затмение андроида проект.

Примечание: передавая строку XML в качестве заголовка или UrlEncodedFormEntity не работал.

ответ

0

Во-первых, вы должны получить метод веб-службы, который работает в браузере - я рекомендую использовать Fiddler2 - его проще построить тело запроса с вашим объектом, а также установить заголовки запроса при выполнении сообщения. Он покажет вам ответ, поэтому он должен помочь в отладке. Что касается вашего кода, я делаю POST к службе WCF и вместо того, чтобы делать

post.setEntity(new UrlEncodedFormEntity(nvp)); 

Я просто делаю:

HttpPost request = new HttpPost(url); 

// Add headers. 
for(NameValuePair h : headers) 
{ 
    request.addHeader(h.getName(), h.getValue()); 
} 

(я использую JSONObjects и я RequestFormat = WebMessageFormat.Json в моих параметрах WebInvoke.

Кроме того, проверьте вы используете правильное имя UriTemplate в свой адрес, поскольку они чувствительны к регистру.

+0

Это было действительно полезно, но я хотел использовать XML для передачи объектов и из службы WCF. вы могли бы помочь с этим или любыми предложениями по использованию JSON или XML. –

+0

Я пробовал скрипач, но все еще застрял. пожалуйста, если вы увидите мое редактирование и общий доступ. –

0

T o вызовите эту службу WCF, вы должны создать действительный запрос SOAP и опубликовать его. Лучше использовать некоторый стек протокола SOAP на Android - например, kSoap2.

example с помощью kSoap2 для вызова службы WCF. просто добавьте KSOAP2 lib в свой проект.для того, как мы добавим KSOAP2 в Android проекта см this post

+0

привет, я действительно пробовал ksoap2. но это не помогло мне. поэтому я переключился на REST. пожалуйста, если вы увидите мое редактирование и общий доступ. –

2

наконец мне удалось отправить JSon объект к моей службы WCF вот мой код

URI uri = new URI("http://esimsol.com/droidservice/pigeonlibrary.service1.svc/save"); 

JSONObject jo1 = new JSONObject(); 
jo1.put("Id", "4"); 
jo1.put("StringValue", "yollo"); 

HttpURLConnection conn = (HttpURLConnection) uri.toURL().openConnection(); 
conn.setRequestProperty("Content-Type","application/json; charset=utf-8"); 
conn.setRequestProperty("Accept", "application/json"); 
conn.setRequestProperty("User-Agent", "Pigeon"); 
conn.setChunkedStreamingMode(0); 
conn.setDoInput(true); 
conn.setDoOutput(true); 
conn.setRequestMethod("POST"); 
conn.connect(); 

DataOutputStream out = new DataOutputStream(conn.getOutputStream()); 
out.write(jo1.toString().getBytes()); 
out.flush(); 

int code = conn.getResponseCode(); 
String message = conn.getResponseMessage(); 

InputStream in = conn.getInputStream(); 
StringBuffer sb = new StringBuffer(); 
String reply; 

try { 
int chr; 
while ((chr = in.read()) != -1) { 
sb.append((char) chr); 
} 
reply = sb.toString(); 
} finally { 
in.close(); 
} 

SampleItem SI = new SampleItem(); 
SI=new Gson().fromJson(reply, SampleItem.class); 

Toast.makeText(getApplicationContext(), SI.getStringValue(),Toast.LENGTH_LONG).show(); 

conn.disconnect(); 

благодаря StackOverflow. Мне пришлось объединить несколько фрагментов кода для этого.