javaandroidhttphttpurlconnectionwit.ai

Why does the HTTP request not work? Wit.ai


I want wit.ai analysing my sentences. When I send the String "where is the door" wit.ai should answer with a JSON which includes that my sentence has the intent : navigation. But unfortunately the wit.ai log says that there is no request going in. What am I doing wrong? The parameters are right, but maybe they are in a false order?

public class MainActivity extends AppCompatActivity {

    String addressM = "https://api.wit.ai/message";
    String accessToken = "xxxxxxxxxxxxxxxxxxxxccc";
    String header = "Authorization: Bearer ";
    String query = "q";
    String message = "where is the door";


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        final Button button = (Button) findViewById(R.id.button);
        final TextView textView = (TextView) findViewById(R.id.textView);


        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                new JSONTask().execute(addressM);
            }
        });

    }

    private class JSONTask extends AsyncTask<String, String, String >{
        @Override
        protected String doInBackground(String... params) {

            HttpURLConnection connection = null;
            BufferedReader reader = null;
            try {
                URL url = new URL(params[0]);
                connection = (HttpURLConnection) url.openConnection();
                connection.setRequestProperty("access_token", "xxxxxxxxxxxxxxxxxxxxxxx");
                connection.setRequestProperty("q", message);
                connection.setRequestMethod("POST");
                connection.connect();

                InputStream stream = connection.getInputStream();

                reader = new BufferedReader(new InputStreamReader(stream));

                StringBuffer buffer = new StringBuffer();

                String line = "";
                while ((line = reader.readLine()) !=null){
                    buffer.append(line);
                }
                return buffer.toString();

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (connection != null){
                    connection.disconnect();
                }
                try {
                    if (reader != null){
                        reader.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            TextView textView = (TextView) findViewById(R.id.textView);
            textView.setText(result);
            Toast.makeText(MainActivity.this, result,
                    Toast.LENGTH_LONG).show();
        }
    }

}

Here is a example what the reponse should be. Relevant for me is that the intent is navigation

  [
    {
    "entities":
    {
    "intent":
    [
    {
    "confidence":
    0.92597581019421
    "value":
    {
    "value":
    "navigation"
    }
    "entity":
    "intent"
    }
    ]
    }
    "confidence":
    null
    "_text":
    "where is the door"
    "intent":
    "default_intent"
    "intent_id":
    "default_intent_id"
    }
    ]

Solution

  • You should be passing the parameters as query parameters, not as HTTP headers. Also the access token should be passed in an authorization HTTP header.

    Try this:

    Uri uri = Uri.parse(addressM)
      .buildUpon()
      .appendQueryParameter("q", message)
      .build();
    URL url = new URL(uri.toString());
    connection = (HttpURLConnection) url.openConnection();
    connection.setRequestProperty("Authorization", "Bearer " + myAccessToken);
    connection.setRequestMethod("POST");
    connection.connect();
    

    If you want to make your life easier using HTTP APIs consider using retrofit (I haven't tried to see if Wit's API is friendly to it), or at the very least try OkHttp.

    static final String MESSAGE_BASE_URL = "https://api.wit.ai/message";
    static final String MY_ACCESS_TOKEN = "...";
    
    private final OkHttpClient client = new OkHttpClient();
    
    ...
    HttpUrl url = HttpUrl.parse(MESSAGE_BASE_URL)
      .newBuilder()
      .addQueryParameter("q", message)
      .build();
    Request request = new Request.Builder()
      .url(url)
      .addHeader("authorization", "Bearer " + MY_ACCESS_TOKEN)
      .build();
    Response response = client.newCall(request).execute();
    return response.body().string();