0

私のマシンには、AndroidおよびIOSデバイスにサービスを提供するために開発した単純なWCFWebサービスがあります。

このサービスには、次のような1つの方法があります。

[OperationContract]
    [WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "/?message={message}")]
    string ServiceMessage(string message);

私は3つのクライアントを持っています。1つは正常に動作するHttpWebRequestを使用する.NETテストクライアント、1つは正常に動作するIOSクライアント、もう1つは失敗するHttpPostクラスとHttpClientクラスで開発したAndroidクライアントです。

Fiddlerリバースプロキシを使用して、.netクライアントの出力をデバッグしました。

POST http://127.0.0.1:8888/Service1.svc/?message=_|JSON MESSAGE BODY|_HTTP/1.1
Content-Type: application/json; charset=utf-8
Host: 127.0.0.1:8888
Content-Length: 338
Expect: 100-continue
Connection: Keep-Alive

_|JSON MESSAGE BODY|_

一方、これはAndroidHTTPPostの出力です。

POST http://10.0.2.2:8888/Service1.svc/ HTTP/1.1
Content-Type: application/json; charset=utf-8
Content-Length: 139
Host: 10.0.2.2:8888
Connection: Keep-Alive
User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4)
Expect: 100-Continue

message=_|JSON MESSAGE BODY|_

ご覧のとおり、.Netはメッセージパラメータを上部の投稿に配置し、メッセージ変数名を下部に配置しませんが、Androidはメッセージ本文を上部の投稿に配置せず、メッセージ変数名をボトム。

これは私のAndroidの郵便番号です、

    HttpPost httpPost = new HttpPost(url);      
    String messageBody = "message=" + jsonMessageParameter;
    StringEntity entity = new StringEntity(messageBody);
    httpPost.setEntity(entity);
    httpPost.setHeader("Content-Type", "application/json; charset=utf-8");
    HttpResponse response = hc.execute(httpPost);
    InputStream content = response.getEntity().getContent();
    String json = ConvertStreamToString(content);

このコードで呼び出すと、サーバーメソッドが呼び出されますが、メッセージメソッドパラメーターはnullです。Uri.Builderクラスで遊んで、Androidの投稿にメッセージをヘッダーに配置させようとしましたが、うまくいきません。誰かがここで私を助けてくれるなら、私は何時間も何時間もこれに固執しています。

前もって感謝します 、

ジェームズ

編集 :

Androidコードを次のように変更しました:

    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
    nameValuePairs.add(new BasicNameValuePair("message", jsonMessageParameter));

    HttpPost httpPost = new HttpPost(url);
     UrlEncodedFormEntity urlEncodedFromEntity = new UrlEncodedFormEntity(
     nameValuePairs);
     urlEncodedFromEntity.setContentType(new BasicHeader("Content-Type",
     "application/json; charset=utf-8"));

    httpPost.setEntity(urlEncodedFromEntity);

    InputStream postStream = httpPost.getEntity().getContent();
    String postOutput = ConvertStreamToString(postStream);
    HttpResponse response = hc.execute(httpPost);
    InputStream content = response.getEntity().getContent();
    String json = ConvertStreamToString(content);

しかし、それでもフィドラーの監視は次のとおりです。

POST http://10.0.2.2:8888/Service1.svc/ HTTP/1.1
Content-Length: 189
Content-Type: application/json; charset=utf-8
Host: 10.0.2.2:8888
Connection: Keep-Alive
User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4)
Expect: 100-Continue

message=_|MESSAGE_JSON|_
4

2 に答える 2

1

ここにはいくつかのポイントがあります。

最初に、message=Android POST 本文に具体的に追加しました。

String messageBody = "message=" + jsonMessageParameter;

指定したため、これも問題になる可能性がありますContent-Type: application/jsonが、追加message=すると、有効な JSON オブジェクトが提供されません。

第 2 に、なぜ .Net 実装は JSON オブジェクトを URL と本体の両方のパラメーターとして複製するのでしょうか? これは、POST リクエストでは奇妙で非常に珍しいように見えます。また、JSON オブジェクトで URL が URL の最大長を超えると、問題が発生する可能性があります。

したがってmessage=、POST を処理するサーバーは URL ではなく本文を読み取る必要があるため、本文を削除し、JSON オブジェクトを URL パラメーターとして削除してみます。

于 2012-04-22T11:12:23.317 に答える
0

HttpPost は投稿用です。

String url;
input = url + URLEncoder.encode(messageBody, "utf-8");
HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet(input);
InputStream stream = httpclient.execute(httpget).getEntity().getContent();
String s = streamToString(stream);
JSONObject jObject = new JSONObject(s); 

この非常に正確なコード (およびいくつかの try/catch) は、GoogleBooks を照会するために機能します。

よろしくお願いします。

于 2012-04-22T10:53:02.007 に答える