Вызов метода RESTful WCFservice с объектом в качестве параметра из Java

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

[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();
        }

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

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, который возвращается методом сервиса.

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

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

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

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

РЕДАКТИРОВАТЬ: попробовал Fiddler2 с успехом. но снова остановился.

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

в Fiddler я добавил тело запроса как <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 eclipse android.

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

3 ответа

Решение

Во-первых, вы должны заставить метод Web-сервиса работать из браузера - я рекомендую использовать 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, и в моих параметрах WebInvoke у меня есть RequestFormat = WebMessageFormat.Json.

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

Наконец, мне удалось отправить объект 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. Мне нужно было объединить несколько фрагментов кода, чтобы добиться этого.

Для вызова этой службы WCF необходимо создать действительный запрос SOAP и опубликовать его. На Android лучше использовать стек протоколов SOAP, например, kSoap2.

Вот пример использования kSoap2 для вызова службы WCF. Просто добавьте KSOAP2 lib в ваш проект. Чтобы узнать, как мы добавляем KSOAP2 в проект Android, смотрите этот пост

Другие вопросы по тегам