JsonWriter POST 在 Android 中无法工作到 WCF Web 服务

Posted

技术标签:

【中文标题】JsonWriter POST 在 Android 中无法工作到 WCF Web 服务【英文标题】:JsonWriter POST not working in Android to WCF web service 【发布时间】:2019-02-03 22:36:12 【问题描述】:

我想知道有人有关于如何使用 JsonWriter 将 JSON 数据从 android 发布到 WCF Web 服务的示例代码吗?

我用 Fiddler 4(带有 POST json 数据的 Composer)测试了我的 WCF,它给了我正确的回报。 但是,当我使用使用 JsonWriter 的 Android 应用程序进行测试时,我没有在 Fiddler 上看到任何操作(我设置 Fiddler 来检查我的 Android Emulator 网络流量,顺便说一下,我正在 Android Emulator 上进行测试。)。

使用相同的 Android 应用程序,我可以使用 JsonReader 向我的 WCF 调用 GET 并获得正确的回复。 它只是用 JsonWriter 调用 POST,在 Fiddler 中没有响应代码或没有任何操作。

对于 JsonWriter(和 Reader),我指的是 Android 开发者 >> JsonWriter

这是我使用 Emulator GET 和 POST 的测试结果(Get 和 Post)。

这是我使用 Fiddler 直接 POST 的测试结果。 首先它给了我 Result 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 服务,只有 Fiddler 直接 POST 会在我的 WCF 项目中达到断点,而 Android 应用程序没有达到它)。不过,我遵循了 Android 开发者网站上的确切示例。我谷歌并没有找到任何使用 JsonWriter 和 OutputStreamWriter 的网站(我看到一些使用 StringWriter 的帖子)。 我可以知道我的代码哪里出错了吗?

【问题讨论】:

经过几周的努力,我了解到 WCF RSETful Web 服务对 URITemplate 中的“/”非常敏感。修改我的网络服务后,上面的代码没有问题了。 【参考方案1】:

基于这篇 *** 帖子WCF has a 'Thing' about URI,我设法解决了这个问题。

我只需要确保我的 POST Web 服务的 URI 模板以“Slash”结尾。

示例:http://10.72.137.98/myWebSvc/posvctFun/ 而不是http://10.72.137.98/myWebSvc/postFun

【讨论】:

以上是关于JsonWriter POST 在 Android 中无法工作到 WCF Web 服务的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 JsonWriter 在序列化多维数组时添加太多换行符?

如何使用 Utf8JsonWriter 编写像“82.0”这样的浮点数,而“.0”完好无损?

找不到案例类的 JsonWriter 或 JsonFormat 类型类

将 Struts 从 2.3.7 升级到 2.3.33 后 JSONWriter.setDateFormatter 的 NoSuchMethodError

Newtonsoft.Json序列化和反序列之javascriptConvert.SerializeObject,DeserializeObject,JsonWriter,JsonReader(示例代

struts2 java.lang.StackOverflowError org.apache.struts2.json.JSONWriter