1

RESTful WCF サービスがあり、そのメソッドの 1 つがオブジェクトをパラメーターとして使用します

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

私はEclipse 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 形式で返します。

フィドラーでは、リクエスト本文を次のように追加しました <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 文字列をrequestbody eclipse android プロジェクトとしてHttpPostまたはHttpRequestに追加する方法が見つからないことです。

注: xml 文字列をHeaderまたはUrlEncodedFormEntityとして渡すことは機能しませんでした。

4

3 に答える 3

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に感謝します。これを実現するには、いくつかのコード スニペットを組み合わせる必要がありました。

于 2012-06-26T04:46:02.183 に答える
0

その WCF サービスを呼び出すには、有効な SOAP 要求を作成して送信する必要があります。Android では、SOAP プロトコル スタックを使用することをお勧めします (例: kSoap2 )

kSoap2を使用して WCF サービスを呼び出す例を次に示します。プロジェクトに KSOAP2 ライブラリを追加するだけです。Android プロジェクトに KSOAP2 を追加する方法については、この投稿を参照してください。

于 2012-06-02T14:11:41.600 に答える
0

まず、ブラウザから Web サービス メソッドを動作させる必要があります。Fiddler2 を使用することをお勧めします。Fiddler2 の使用をお勧めします。オブジェクトを使用してリクエスト ボディを構築し、ポストを行うときにリクエスト ヘッダーを設定するのも簡単です。応答が表示されるので、デバッグに役立ちます。あなたのコードに関しては、私はWCFサービスへのPOSTを行っていますが、代わりに

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 があります。

また、大文字と小文字が区別されるため、URL で正しい UriTemplate 名を使用していることを確認してください。

于 2012-06-02T13:10:06.647 に答える