Я хотел бы знать, что у кого-нибудь есть образец кода о том, как использовать JsonWriter для публикации данных JSON в веб-службе WCF с Android?
Я протестировал свой WCF с Fiddler 4 (Composer с данными POST json), и он дал мне правильный результат.
Однако, когда я тестировал свое приложение для Android, использующее JsonWriter, я не видел никаких действий в Fiddler (я настроил Fiddler для проверки сетевого трафика Android-эмулятора, кстати, я тестирую Android-эмулятор).
С тем же приложением Android я могу вызвать GET с JsonReader в свой WCF и получить правильный ответ.
Просто вызов POST с JsonWriter не получил кода ответа или никаких действий в Fiddler.
Для JsonWriter (и Reader) я обращаюсь к разработчику Android >> JsonWriter
Вот мои результаты тестов (Get и Post) с эмулятором GET и POST.
Вот мои результаты теста с Fiddler direct POST.
Сначала он дал мне Результат 307, затем следовал 200.
А вот как я использую JsonWriter для публикации (этот блок был из AsyncTask).
try
{
Log.d("TEST_JSON", "URL: " + params[0]);
URL url = new URL(params[0]);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Accept","application/json");
conn.setRequestProperty("Content-Type","application/json");
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.setAllowUserInteraction(false);
// conn.connect();
OutputStream out = conn.getOutputStream();
JsonWriter writer = new JsonWriter(new OutputStreamWriter(out, "UTF-8"));
try
{
writer.setIndent(" ");
if (params[1].trim() == "ARRAY")
{
// Write array to WCF.
}
else if (params[1].trim() == "OBJ")
{
// Write object to WCF. <<== I am testing with one object.
writer.beginObject();
writer.name("ShipNo").value("SI10101");
writer.name("DoNo").value("DO230401");
writer.name("PartNo").value("102931-1201");
writer.name("Qty").value(1);
writer.name("ShipIn").value(1);
writer.endObject();
}
}
finally
{
writer.close();
out.close();
}
// If I enable below blocks, I will see 307 response code in Fiddler.
/*
conn.connect();
int responseCode = conn.getResponseCode();
Log.d("TEST_JSON", "Code: " + String.valueOf(responseCode));
*/
Log.d("TEST_JSON", "Finish sending JSON.");
conn.disconnect();
}
catch (IOException e)
{
Log.e("TEST_JSON",e.getMessage()); // <<-- No error from this try catch block.
}
Я пытался и до сих пор не могу понять, почему JsonWriter не сработал для моего WCF (я подключил свой WCF к моей службе localhost, только прямой POST Fiddler попадет в точку останова в моем проекте WCF, в то время как приложение Android до него не дошло). Однако я следую точному примеру с сайта разработчиков Android. Я погуглил и не нашел ни одного сайта об использовании JsonWriter с OutputStreamWriter (я видел несколько сообщений с использованием StringWriter).
Могу ли я узнать, где ошибся мой код?
Основываясь на этом сообщении StackOverFlow В WCF есть особенность URI, мне удалось решить эту проблему.
Все, что мне нужно, это убедиться, что моя веб-служба POST имеет шаблон URI, оканчивающийся на «косую черту».
Пример: http://10.72.137.98/myWebSvc/posvctFun/
Вместо http://10.72.137.98/myWebSvc/postFun
После нескольких недель борьбы я узнал, что веб-служба WCF RSETful очень чувствительна к "/" в URITemplate. После изменения моего веб-сервиса вышеуказанный код больше не работает.