发送HTTP POST和处理JSON响应

发送HTTP POST和处理JSON响应

问题描述:

所以我从来没有使用过HTTP后,我需要发送一个响应,并从相同的接收响应。这里是我提供的文档:发送HTTP POST和处理JSON响应

编辑:此代码示例来自Microsoft Azure机器学习,我必须将其集成到我的Android应用程序来做数据预测。

URL

https://**api-version=2.0&details=true 

请求

"Inputs": { 
    "input1": { 
     "ColumnNames": [ 
     "Light", 
     "Proximity", 
     "Ax", 
     "Ay", 
     "Az", 
     "Gx", 
     "Gy", 
     "Gz" 
     ], 
     "Values": [ 
     [ 
      "0", 
      "0", 
      "0", 
      "0", 
      "0", 
      "0", 
      "0", 
      "0" 
     ], 
     [ 
      "0", 
      "0", 
      "0", 
      "0", 
      "0", 
      "0", 
      "0", 
      "0" 
     ] 
     ] 
    } 
    }, 
    "GlobalParameters": {} 
} 

样品响应

{ 
    "Results": { 
    "output1": { 
     "type": "DataTable", 
     "value": { 
     "ColumnNames": [ 
      "Scored Probabilities for Class \"BackPocket\"", 
      "Scored Probabilities for Class \"Ear\"", 
      "Scored Probabilities for Class \"Handbag\"", 
      "Scored Probabilities for Class \"SidePocket\"", 
      "Scored Labels" 
     ], 
     "ColumnTypes": [ 
      "Numeric", 
      "Numeric", 
      "Numeric", 
      "Numeric", 
      "Categorical" 
     ], 
     "Values": [ 
      [ 
      "0", 
      "0", 
      "0", 
      "0", 
      "BackPocket" 
      ], 
      [ 
      "0", 
      "0", 
      "0", 
      "0", 
      "BackPocket" 
      ] 
     ] 
     } 
    } 
    } 
} 

如何以Java/Android方式发送此Post Request,然后处理响应?

我完全陌生,因此我不知道。我没有搜索HTTP POST等,但无法找到足够的发送和接收响应。任何图书馆的建议也非常感谢。

谢谢。

+0

您使用的是Android上的任何HTTP库? – Panther

+0

@Panther无。此代码示例来自Microsoft Azure机器学习,我必须将其集成到我的Android应用程序中才能进行数据预测。 –

+0

[在Android中发送POST数据]可能的重复(http://*.com/questions/2938502/sending-post-data-in-android) –

有很多HTTP连接库。你可以用他们任何一个:

  • OkHttp - 非常强大和简单的库。你可以找到很多关于它的page

  • 改造图书馆的例子自带OkHttp和包装要求到接口Retrofit Link

为了对付JSON,我建议你使用GSON library

所以处理您的问题的基本算法如下:

  • 用gett创建GSON模型文件ERS和setter
  • 与方法创建HTTP调用你需要
  • 拨打电话和接收请求(这样做不是在UI线程)
  • 与创建getter方法解析请求/ setter方法

下面是一个例子请求使用Google的Volley作为http请求,使用Gson将json数据转换为对象。如果您打算使用Gson,则需要创建表示json数据的pojos。

你输入的数据是相当混乱,我没有尝试转换,从一个POJO,那是读者的练习;)

String request = "{\"Inputs\":{\"input1\":{\"ColumnNames\":[\"Light\",\"Proximity\",\"Ax\",\"Ay\",\"Az\",\"Gx\",\"Gy\",\"Gz\"],\"Values\":[[\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"],[\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\",\"0\"]]}},\"GlobalParameters\":{}}"; 

     Context appContext = InstrumentationRegistry.getTargetContext(); 
     String url ="https://**api-version=2.0&details=true"; 

     RequestQueue queue = Volley.newRequestQueue(appContext); 

     StringRequest stringRequest = new StringRequest(Request.Method.POST, url, 
       new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 

         Log.d("TAG", "success: " + response); 
         String jsonResponse = response; 
         Gson gson = new Gson(); 
         Stuff stuffObject = gson.fromJson(jsonResponse, Stuff.class); 

        } 
       }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 

      } 
     }); 

     queue.add(stringRequest); 

POJO的对象与jsonSchemaToPojo

Stuff.class产生

public class Stuff { 

    @SerializedName("Results") 
    @Expose 
    private Results results; 

    public Results getResults() { 
     return results; 
    } 
    public void setResults(Results results) { 
     this.results = results; 
    } 
} 

Results.class

public class Results { 

    @SerializedName("output1") 
    @Expose 
    private Output1 output1; 

    public Output1 getOutput1() { 
     return output1; 
    } 

    public void setOutput1(Output1 output1) { 
     this.output1 = output1; 
    } 
} 

Output1.class

public class Output1 { 

    @SerializedName("type") 
    @Expose 
    private String type; 
    @SerializedName("value") 
    @Expose 
    private Value value; 

    public String getType() { 
     return type; 
    } 
    public void setType(String type) { 
     this.type = type; 
    } 
    public Value getValue() { 
     return value; 
    } 
    public void setValue(Value value) { 
     this.value = value; 
    } 
} 

Value.class

public class Value { 

    @SerializedName("ColumnNames") 
    @Expose 
    private List<String> columnNames = new ArrayList<String>(); 
    @SerializedName("ColumnTypes") 
    @Expose 
    private List<String> columnTypes = new ArrayList<String>(); 
    @SerializedName("Values") 
    @Expose 
    private List<List<String>> values = new ArrayList<List<String>>(); 

    public List<String> getColumnNames() { 
     return columnNames; 
    } 
    public void setColumnNames(List<String> columnNames) { 
     this.columnNames = columnNames; 
    } 
    public List<String> getColumnTypes() { 
     return columnTypes; 
    } 
    public void setColumnTypes(List<String> columnTypes) { 
     this.columnTypes = columnTypes; 
    } 
    public List<List<String>> getValues() { 
     return values; 
    } 
    public void setValues(List<List<String>> values) { 
     this.values = values; 
    } 

} 
+0

排除已被弃用,所以我不认为它是一个好主意,推荐它 –

+0

@AntonKazakov你有这个索赔的参考?我使用'compile'c​​om.android.volley:volley:1.0.0''并且没有看到弃用警告。 –

+0

也许我错了。我很久以前就使用过排序,上次我在github mcxiaoke/android-volley上打开它的回购,它说它已被弃用。但如果你从谷歌编译它的意思是我错了。但无论如何OkHttp库做得更好:) –